私はCameraPreviewデータから短い連続mp4ファイルをMediaCodec.createInputSurface()
経由で生成しようとしています。ただし、MediaCodec
とそれに関連付けられたサーフェスを再作成するには、mCamera.setPreviewTexture(...)
への別の呼び出しを許可するようにカメラを停止する必要があります。この遅延は、受け入れられない量のフレームの欠落を招く。Surface入力のMediaCodec:チャンク出力を生成する
したがって、入力サーフェスを再作成することなく、CODEC_CONFIG
とEND_OF_STREAM
のデータを定期的に生成する必要があるため、mCamera.setPreviewTexture(...)
を呼び出す必要があります。 MediaFormat
が変更されていないと仮定してこれは可能ですか?
は(私はfaddenのCameraToMpegTest例を適応しています私の完全なコードはhereです。)
成功しなかった:
がMediaCodec
を排出、MediaCodec.signalEndOfInputStream()
を呼び出し、その後、チャンク間MediaCodec.flush()
を呼び出すことがでIllegalStateException
を生成します2番目のコールはMediaCodec.signalEndOfInputStream()
です。
、MediaCodec.signalEndOfInputStream()
を呼び出すMediaCodec
を排出し、再度MediaCodec.createInputSurface()
を呼び出すことなく、チャンク間MediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()
を呼び出すと、次のエラーを生成します。fadden感謝を
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)
を解決しました。完全なソリューションソースはhereです。