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.