カメラの映像をネットワークに流そうとしたが… - きままな日記帳
昨日のこの件の続きをもう少し調べてみる。
問題の切り分けとしては、MediaRecorder#setOutputFile()にFileDescriptorで物理ファイルを指定した場合とSocketを指定した場合。
Socket socket = new Socket(DEST_ADDR, PORT);
ParcelFileDescriptor pfd = ParcelFileDescriptor.fromSocket(socket);
FileDescriptor fd = pfd.getFileDescriptor();
このfdからFileOutputStream経由でデータをwriteすると、正常に通信できるが、MediaRecorderに渡すとエラーになる。
同じfdでも、Fileから作成したものは、MediaRecorderに渡すときちんとMP4ファイルが作成される。
File file = new File("/sdcard/test2.mp4");
ParcelFileDescriptor pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_WRITE_ONLY | ParcelFileDescriptor.MODE_CREATE);
正常ログと異常ログを見ていると、異なるのはほぼこの一つ
08-29 03:41:31.505: ERROR/OsclDirectFileIO(2193): [LargeFileSupport]OsclDirectFileIO::Seek offset = -1509188668, ireturn = 4 seekmode =-1
Socketの場合はこれが出力されたあとで、
08-29 03:41:31.543: ERROR/AuthorDriver(2193): Command 14 completed with error -1 08-29 03:41:31.543: ERROR/MediaRecorder(5393): start failed: -1
のログが出力される。Command 14とはソースを検索するとMediaRecorder#start()のことのようだが、これがエラーとなっている。
OsclDirectFileIOは、OpenCoreの中の一部っぽいのだけど、DirectFileIOと言うくらいなので物理ファイルに特化した処理が実装されているのだろうか?そうだとしたらSocketだと上手く動作しない理由は説明できそうだけど、これがGalaxy S特有なのかまでは分からない。
コメント