¿Cómo usar la decodificación de video acelerada por hardware en Android?

Necesito decodificación H.264 acelerada por hardware para un proyecto de investigación, para probar un protocolo autodefinido.

Como tengo búsqueda en la web, he encontrado algunas formas de realizar la decodificación de video acelerada por hardware en Android.

  1. Utiliza la ffmpeg miedo al escenario (descripción general de libstagefright) o use libstagefright en el sistema operativo directamente, como aquí.
  2. Utiliza la abrir max en una plataforma de hardware específica. me gusta aquí sobre el dispositivo samsung y aquí sobre la serie Qualcomm Snapdragon
  3. Algunas personas mencionaron jugador de PV,

Algunas personas "decir" libstagefright es la única forma, mientras que los chicos de Qualcomm obviamente han tenido éxito.

Actualmente no estoy seguro de qué manera podría funcionar. Estoy un poco confundido ahora. Si todo pudiera funcionar, ciertamente preferiría un método independiente del hardware.

Como probé algunos reproductores de video de su aceleración H/W con Galaxy Tab 7.7 (3.2 y Enxyos), VLC, Mobo, Rock, vplayer, rock y mobo funcionan bien, VLC no funciona, vplayer parece tener una representación error que cuesta su rendimiento.

De todos modos, realicé una 'operación' en Rockplayer y eliminé todas sus bibliotecas .so en data\data\com.redirecting\rockplayer, y la decodificación del software falla mientras que la decodificación hw sigue funcionando bien. Me pregunto cómo hicieron eso. Me parece que la aceleración hw podría ser independiente de las plataformas de hardware.

¿Alguien puede resolver este problema? ¿O proporcionar alguna referencia con información adicional o mejores detalles?

preguntado el 04 de julio de 12 a las 03:07

¡Estoy un poco confundido! ¿Desea acceder directamente (sin las API de medios de Android) al decodificador acelerado H/W para decodificar sus flujos de bits? Porque todos los SOC de teléfonos modernos decodifican H.264 usando H/w Acceleration. -

@OakBytes, quiero implementar la decodificación acelerada H/W sin importar cómo se haga. Ahora solo sé cómo decodificar la transmisión con la decodificación del software ffmpeg. La aceleración H/W se refiere al nivel de rendimiento a 1080P a 30 fps, mientras que la decodificación de software es mucho más débil. He evitado referirme a la decodificación de software como usando CPU porque el módulo de aceleración H/W también es parte de la CPU. ¿Qué quiere decir con todos los teléfonos modernos que ya usan aceleración H/W? -

Cuando se usa Gallery Media Player para reproducir clips H.264, todos los teléfonos Android recientes usan un decodificador H.264 acelerado por H/W. Supongo que planea usar el decodificador H.264 para decodificar el flujo de bits H.264 sin procesar y obtener una salida decodificada, en lugar de reproducir un archivo que contiene video H.264 y algo de audio. -

@OakBytes Tienes razón. Eso es exactamente lo que quería. Solo flujos de bits sin formato y sin contenedores mkv o mp4. Lo siento, no lo dejé más claro. Quiero llamar a la decodificación H/W basada en NAL o nivel de cuadro sobre flujo de bits sin procesar, en lugar de configurar un reproductor multimedia para archivos. -

@Holyglenn: ¿ha tenido éxito con su proyecto? ¿Quizás encontraste alguna información nueva sobre el tema? -

3 Respuestas

Para responder a la pregunta anterior, permítanme presentar algunos conceptos relacionados con Android

OpenMAX Android usa OpenMAX para la interfaz de códec. Por lo tanto, todos los códecs nativos (acelerados por hardware o no) proporcionan una interfaz OpenMAX. Esta interfaz es utilizada por StageFright (Player framework) para decodificar medios usando códec

NDK Android permite que las aplicaciones Java interactúen con bibliotecas nativas C/C++ subyacentes mediante NDK. Esto requiere el uso de JNI (interfaz nativa de Java).

Ahora yendo a tu pregunta How to tap native decoder to decode raw video bitstream?

En la versión de Android 4.0 y anteriores, Android no brindaba acceso a los decodificadores de video subyacentes en la capa de Java. Necesitará escribir código nativo para interactuar directamente con el decodificador OMX. Aunque esto es posible, no es trivial, ya que necesitaría saber cómo funciona OMX y cómo asignar este OMX a la aplicación mediante NDK.

En 4.1 (versión Jelly Bean), Android parece proporcionar acceso a decodificadores acelerados por hardware a nivel de aplicación a través de las API de JAVA. Más detalles sobre las nuevas API en http://developer.android.com/about/versions/android-4.1.html#Multimedia

Respondido 08 Jul 12, 07:07

Gracias por la aclaración de conceptos y respuestas. He revisado las referencias solo para encontrar que es demasiado cierto que debo profundizar en el marco del sistema operativo. Esto definitivamente funcionaría. - glenn yu

Sin embargo, como sugiere la operación en Rockplayer, en la que eliminé todas las bibliotecas .so y la decodificación del hardware aún funciona mientras falla la descodificación del software, podría haber una forma más sencilla de hacerlo en la versión de Android 4.0 y siguientes. En cuanto a mi decodificación de flujo de bits sin procesar y todo eso, es posible que tenga que resolver todo el asunto de OMX de todos modos. ¿Puedes dar la API de Java en Jelly Bean? - glenn yu

@Holygenn He agregado un enlace a las API de Media Player en Jelly Bean. En el caso de RockPlayer, ¿muestra vídeo directamente mediante decodificadores acelerados por hardware o proporciona búferes de salida? Es más fácil hacer lo primero que lo segundo con decodificadores acelerados por hardware: Bytes de roble

RockPlayer tiene una fuente cercana, solo la configuración de ffmpeg está abierta, por lo tanto, no estoy seguro de cuál usó. Supongo que en Rockplayer después de la demultiplexación, el video sin procesar se alimenta a un interruptor, lo que permite al usuario elegir entre el decodificador de terceros sw o el decodificador del sistema hw como sugiere su menú, luego se procesa y se muestra. Hice el experimento de Rockplayer bajo Honeycomb 3. Por lo tanto, parece que habría una manera de aprovechar los códecs del sistema sin NDK/JNI, no diciendo que NDK sea demasiado problemático, pero explorando una posibilidad. - glenn yu

Según tengo entendido, Jelly bean MediaCodec proporciona códecs de sistema (SW/HW) para el flujo de bits sin procesar. Eso parece ser exactamente lo que necesito: necesito decodificar (con hw) y mostrar la transmisión de video sin formato. Sin embargo, como lo impulsa la curiosidad, estoy aún más ansioso por saber cómo puedo lograr la decodificación acelerada HW sin Jelly Bean. Muchas gracias por su ayuda hasta ahora. - glenn yu

Utiliza la ExoPlayer (gitHub).

Es un proyecto de código abierto patrocinado por Google que reemplaza al MediaPlayer de la plataforma. Cada componente de la canalización es extensible, incluido el origen de la muestra (cómo se extraen los fotogramas H.264 de su protocolo personalizado) a la representación (a una superficie, una textura de superficie, etc.).

Incluye un bonito aplicación de demostración que muestra el uso.

contestado el 11 de mayo de 16 a las 23:05

Es posible que desee probar Extractor de medios y MediaCodec (También están disponibles en NDK - AMediaExtractor y AMediaCodec - vea la muestra para reproducir .mp4 aquí códec nativo)

respondido 13 mar '17, 12:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.