我試圖通過MediaCodec.createInputSurface()
從CameraPreview數據生成短序列mp4文件。但是,重新創建MediaCodec
及其關聯的Surface需要停止攝像機以允許對mCamera.setPreviewTexture(...)
的另一個呼叫。這種延遲會導致不可接受的丟幀數量。帶有表面輸入的MediaCodec:生成分塊輸出
因此,我需要定期生成CODEC_CONFIG
和END_OF_STREAM
數據,而不重新創建輸入曲面,因此必須調用mCamera.setPreviewTexture(...)
。假設MediaFormat
保持不變,這可能嗎?
(我適應法登的CameraToMpegTest例如我的完整代碼是here。)
不成功的嘗試:
調用MediaCodec.signalEndOfInputStream()
,引流MediaCodec
,然後調用塊之間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)
法登解決感謝。完整的解決方案來源是here。
謝謝噸! 'CodecInputSurface.updateSurface(newSurface)'做'release(); mSurface = newSurface; eglSetup();'。然後我調用'mMediaCodec.start(); mInputSurface.makeCurrent(); STextureRender.surfaceCreated();'。在下一次調用'SurfaceTexture.updateTexImage()'時,我得到'E/GLConsumer:checkAndUpdateEglState:無效的當前EGLContext'。有任何想法嗎? [簡而言之](http://pastebin.com/znwvz6wB)。 [完整代碼](https://github.com/OnlyInAmerica/HWEncoderExperiments/blob/chunked2/HWEncoderExperiments/src/main/java/net/openwatch/hwencoderexperiments/ChunkedHWRecorder.java)。我會繼續努力的。 – dbro
答覆已更新。 – fadden
我需要給你買一瓶啤酒。在每次調用「CodecInputSurface.updateSurface(newSurface)'後,我還必須將我的調用移除到'STextureRender.surfaceCreated()'。 – dbro