Cómo mantener dos o más instancias de mediacodec en Android
Tengo un viewPager2 VERTICAL, su viewHolder utiliza SurfaceView para reproducir mp4;
Y en cualquier momento, solo tiene una instancia de viewHolder, una superficie para reproducir video.
Tengo dos interfaces:
IMediaCodecProxy
interface IMediaCodecProxy {
//todos los métodos son iguales a MediaCodec
fun selectCodec()
fun configureCodec()
fun release()
fun flush()
}
IMediaCodecPool
interface IMediaCodecPool {
fun getCurrentCodec(): MediaCodecWrapper?
fun selectorCodec(configure: MediaCodecAdapter.Configuration)
fun resetAndStoreCodec(codec: MediaCodecWrapper)
}
IMediaCodecProxy es un proxy de MediaCodec, la firma de sus métodos es igual a MediaCodec;
Lo que IMediaCodecPool hace es mantener todas las instancias de mediaCodec configuradas/iniciadas;
Quiero mantener el estado configurado de mediaCodec cuando se libere;
Lo que hago es:
Paso 1. cuando se completa la reproducción del video, IMediaCodecProxy#release mientras trabaja
Paso 2. si la instancia actual de codec se puede mantener (limitado por algo)
Paso 3. IMediaCodecPool#resetAndStoreCodec trabaja
Paso 4. se destruye la superficie y se crea el siguiente viewHolder -> se crea la superficie de nextViewHolder, IMediaCodecProxy#newCodec(Creo una nueva instancia de codec porque los tipos mime de los dos videos son diferentes), luego IMediaCodecProxy#configure donde falló
No sé qué debo hacer en IMediaCodecPool#resetAndStoreCodec.
Intenté usar codec#flush, pero no fue útil
Entonces, no sé qué salió mal, tal vez en la superficie? tal vez en MediaCodec? tal vez en el estado del codec.
¡Gracias por la ayuda!
davy.ai
Parece que estás tratando de implementar un grupo de instancias de MediaCodec para mantenerlas configuradas y listas para su uso, incluso después de haber sido liberadas. Sin embargo, estás experimentando algunos problemas al intentar reutilizar una instancia de códec para un nuevo video en una superficie diferente.
Basándonos en tu descripción, es difícil determinar la causa exacta del problema, pero aquí tienes algunas sugerencias que podrían ser útiles:
MediaCodec.flush()
)MediaCodec.reset()
antes de configurarla con los nuevos parámetros. Esto garantizará que cualquier estado y búferes anteriores se borren y que el códec esté listo para usar con el nuevo video.También vale la pena mencionar que trabajar con SurfaceView puede ser complicado, especialmente cuando se trata de múltiples instancias en la misma pantalla. Es posible que desees verificar que tu implementación de SurfaceView sea correcta y que no esté causando interferencias con los códecs u otros componentes de tu aplicación.
¡Espero que esto sea de ayuda y buena suerte con tu implementación!