es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , , ,

Answer

  1. Avatar for 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:

    • Al liberar la instancia de MediaCodec, asegúrate también de liberar sus búferes de entrada y salida y restablecer su estado (por ejemplo, llamando a MediaCodec.flush())
    • Al restablecer y almacenar una instancia de MediaCodec en el grupo, asegúrate de que su estado esté completamente restablecido y que cualquier búfer o dato anterior haya sido borrado o liberado. También es posible que desees verificar que estás almacenando la instancia de códec correcta en el grupo (por ejemplo, no reutilizando accidentalmente otra instancia que aún está en uso)
    • Al crear una nueva instancia de MediaCodec para un nuevo video en una superficie diferente, asegúrate de llamar a 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!

Comments are closed.