MediaCodec con entrada de superficie: produciendo salida fragmentada
Estoy tratando de producir archivos mp4 secuenciales cortos a partir de datos de CameraPreview a través deMediaCodec.createInputSurface()
. Sin embargo, recreando elMediaCodec
y su superficie asociada requiere detener la cámara para permitir que otra llamadamCamera.setPreviewTexture(...)
. Este retraso produce una cantidad inaceptable de cuadros eliminados.
Por lo tanto necesito generar elCODEC_CONFIG
yEND_OF_STREAM
datos periódicamente sin volver a crear la superficie de entrada, y por lo tanto tener que llamarmCamera.setPreviewTexture(...)
. ¿Es esto posible asumiendo laMediaFormat
no ha cambiado?
(Estoy adaptando Fadden'sCameraToMpegTest ejemplo. Mi código completo esaquí)
Intentos fallidos:
VocaciónMediaCodec.signalEndOfInputStream()
, drenando elMediaCodec
, y luego llamandoMediaCodec.flush()
entre trozos produce unaIllegalStateException
en la segunda llamada aMediaCodec.signalEndOfInputStream()
.
VocaciónMediaCodec.signalEndOfInputStream()
, drenando elMediaCodec
, y luego llamandoMediaCodec.stop(); MediaCodec.configure(...), MediaCodec.start()
entre trozos sin volver a llamarMediaCodec.createInputSurface()
produce el siguiente error:
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)
Resuelto Gracias fadden La fuente de solución completa esaquí.