Android MediaCodec Codificar y decodificar en modo asincrónico

Estoy tratando de decodificar un video de un archivo y codificarlo en un formato diferente conMediaCodec en el nuevoModo asincrónico compatible con API Nivel 21 y superior (Android OS 5.0 Lollipop).

Hay muchos ejemplos para hacer esto enModo sincrónico en sitios comoGran escamaDe GoogleGrafikay docenas de respuestas en StackOverflow, pero ninguna de ellas admite el modo asíncrono.

No necesito mostrar el video durante el proceso.

Creo que el procedimiento general es leer el archivo con unMediaExtractor como la entrada a unMediaCodec(decodificador), permite que la salida del decodificador se procese en unSurface esa es también la entrada compartida en unaMediaCodec(codificador), y finalmente escribir el archivo de salida del codificador a través de unMediaMuxer. losSurface se crea durante la configuración del codificador y se comparte con el decodificador.

Puedo decodificar el video en unTextureView, pero compartiendo elSurface con el codificador en lugar de la pantalla no ha tenido éxito.

ConfiguroMediaCodec.Callback()s para mis dos códecs. Creo que un problema es que no sé qué hacer en la devolución de llamada del codificadoronInputBufferAvailable() función. No sé qué (o sé cómo) copiar datos delSurface en el codificador: eso debería suceder automáticamente (como se hace en la salida del decodificador concodec.releaseOutputBuffer(outputBufferId, true);) Sin embargo, creo queonInputBufferAvailable requiere una llamada acodec.queueInputBuffer para funcionar Simplemente no sé cómo establecer los parámetros sin obtener datos de algo así comoMediaExtractor como se usa en el lado Decode.

Si tienes unEjemplo que abre un archivo de video, lo decodifica, lo codifica a una resolución o formato diferente usando el asíncronoMediaCodec devoluciones de llamada, y luego lo guarda como un archivo, por favor comparta su código de muestra.

===EDITAR ===

Aquí hay un ejemplo de trabajo en modo síncrono de lo que estoy tratando de hacer en modo asíncrono: ExtractDecodeEditEncodeMuxTest.java:https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/ExtractDecodeEditEncodeMuxTest.java Este ejemplo está funcionando en mi aplicación.

Respuestas a la pregunta(2)

Su respuesta a la pregunta