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í.

Respuestas a la pregunta(1)

Su respuesta a la pregunta