経由で CameraPreview データから短いシーケンシャル mp4 ファイルを生成しようとしていますMediaCodec.createInputSurface()
。ただし、MediaCodec
とそれに関連付けられているサーフェスを再作成するには、カメラを停止して への別の呼び出しを許可する必要がありmCamera.setPreviewTexture(...)
ます。この遅延により、許容できない量のドロップ フレームが発生します。
したがって、入力サーフェスを再作成せずにCODEC_CONFIG
とデータを定期的に生成する必要があるため、を呼び出す必要があります。が変更されていないと仮定すると、これは可能ですか?END_OF_STREAM
mCamera.setPreviewTexture(...)
MediaFormat
(私は fadden のCameraToMpegTestの例を適応させています。私の完全なコードはこちらです)
失敗した試行:
を呼び出しMediaCodec.signalEndOfInputStream()
、 をドレインし、チャンク間でMediaCodec
呼び出すと、への 2 回目の呼び出しで が生成されます。MediaCodec.flush()
IllegalStateException
MediaCodec.signalEndOfInputStream()
を呼び出しMediaCodec.signalEndOfInputStream()
、 を排出してMediaCodec
から、MediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()
再度呼び出さずにチャンク間で呼び出すとMediaCodec.createInputSurface()
、次のエラーが発生します。
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/Surface﹕ queueBuffer: error queuing buffer to SurfaceTexture, -19
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/IMGSRV﹕ :0: UnlockPostBuffer: Failed to queue buffer 0x592e1e70
09-30 13:12:49.889 17638-17719/x.xx.xxxx E/CameraToMpegTest﹕ Encoding loop exception!
09-30 13:12:49.889 17638-17719/x.xx.xxxx W/System.err﹕ java.lang.RuntimeException: eglSwapBuffers: EGL error: 0x300b
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.checkEglError(ChunkedHWRecorder.java:731)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder$CodecInputSurface.swapBuffers(ChunkedHWRecorder.java:713)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.ChunkedHWRecorder.startRecording(ChunkedHWRecorder.java:164)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at x.xx.xxxx.HWRecorderActivity$CameraToMpegWrapper.run(HWRecorderActivity.java:76)
09-30 13:12:49.896 17638-17719/x.xx.xxxx W/System.err﹕ at java.lang.Thread.run(Thread.java:841)
解決しました fadden に感謝します。完全なソリューション ソースはここにあります。