我正在尝试通过
因此,我需要定期生成
(我正在适应fadden的CameraToMpegTest示例。我的完整代码在here) 未成功尝试: 调用
在分块之间调用
MediaCodec.createInputSurface()
从CameraPreview数据生成短的连续mp4文件。然而,重新创建MediaCodec
及其相关表面需要停止相机以允许另一个调用mCamera.setPreviewTexture(...)
。这种延迟会导致无法接受的丢帧量。因此,我需要定期生成
CODEC_CONFIG
和END_OF_STREAM
数据,而无需重新创建输入表面,从而不必调用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。完整的解决方案源代码在这里。
CodecInputSurface.updateSurface(newSurface)
执行release(); mSurface = newSurface; eglSetup();
。然后我调用mMediaCodec.start(); mInputSurface.makeCurrent(); STextureRender.surfaceCreated();
。在下一次调用SurfaceTexture.updateTexImage()
时,我得到了E/GLConsumer﹕ checkAndUpdateEglState: invalid current EGLContext
。有什么想法吗?简述。完整代码。我会继续努力的。 - dbroCodecInputSurface.updateSurface(newSurface)
后,我还必须删除对STextureRender.surfaceCreated()
的调用。 - dbro