MediaCodec com entrada de superfície: produzindo saída em partes
Estou tentando produzir arquivos mp4 sequenciais curtos a partir dos dados CameraPreview viaMediaCodec.createInputSurface()
. No entanto, recriar oMediaCodec
e é associado Surface requer parar a câmera para permitir outra chamada paramCamera.setPreviewTexture(...)
. Esse atraso resulta em uma quantidade inaceitável de quadros perdidos.
Portanto, preciso gerar oCODEC_CONFIG
eEND_OF_STREAM
dados periodicamente sem recriar a entrada Surface, e assim ter que chamarmCamera.setPreviewTexture(...)
. Isso é possível assumindo aMediaFormat
está inalterado?
(Estou adaptando o faddenCameraToMpegTest exemplo. Meu código completo éAqui)
Tentativas malsucedidas:
ChamandoMediaCodec.signalEndOfInputStream()
, drenando oMediaCodec
e, em seguida, chamandoMediaCodec.flush()
entre pedaços produz umIllegalStateException
na segunda chamada paraMediaCodec.signalEndOfInputStream()
.
ChamandoMediaCodec.signalEndOfInputStream()
, drenando oMediaCodec
e, em seguida, chamandoMediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()
entre pedaços sem voltar a chamarMediaCodec.createInputSurface()
produz o seguinte erro:
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)
Resolvido Obrigado fadden. A fonte completa da solução éAqui.