【发布时间】:2013-10-06 19:02:59
【问题描述】:
我正在尝试通过 MediaCodec.createInputSurface() 从 CameraPreview 数据生成简短的连续 mp4 文件。但是,重新创建 MediaCodec 及其关联的 Surface 需要停止相机以允许再次调用 mCamera.setPreviewTexture(...)。这种延迟会导致无法接受的丢帧数量。
因此,我需要定期生成CODEC_CONFIG 和END_OF_STREAM 数据,而无需重新创建输入Surface,因此必须调用mCamera.setPreviewTexture(...)。假设MediaFormat 不变,这可能吗?
(我正在改编fadden的CameraToMpegTest示例。我的完整代码是here)
不成功的尝试:
调用MediaCodec.signalEndOfInputStream(),排空MediaCodec,然后在块之间调用MediaCodec.flush(),在第二次调用MediaCodec.signalEndOfInputStream()时产生IllegalStateException。
调用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。完整的解决方案来源是here。
【问题讨论】:
标签: android android-mediacodec