2012-07-04 18 views
29

Necesito decodificación H.264 acelerada por hardware para un proyecto de investigación, para probar un protocolo autodefinido.¿Cómo usar la descodificación de video acelerada por hardware en Android?

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

  1. Uso ffmpeg libstagefright (overview of libstagefright) o utilizar libstagefright en el sistema operativo directamente, como here.
  2. Utilice OpenMax en una plataforma de hardware específica. como here about samsung device y here about Qualcomm Snapdragon series
  3. Algunas personas mencionaron PVplayer,

Algunas personas "say" libstagefright es la única manera de Qualcomm, mientras que los chicos han hecho el éxito obviamente.

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 he probado algunos reproductores de video de su aceleración de H/W con Galaxy Tab 7.7 (3.2 & Enxyos), VLC, Mobo, Rock, vplayer, rock y mobo funcionan bien, VLC no funciona, vplayer parece tener un error de renderizado que cuesta su rendimiento.

De todos modos, hice una 'operación' en Rockplayer y eliminé todas sus .so libs en data \ data \ com.redirecting \ rockplayer, y las fallas de decodificación de software mientras la decodificación hw funciona bien! Me pregunto cómo lo hicieron. Me parece que la aceleración de hw podría ser independiente de las plataformas de hardware.

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

+0

Estoy algo confundido! ¿Desea acceso directo (sin API multimedia de Android) al decodificador acelerado H/W para decodificar sus flujos de bits? Porque todos los SOCs de teléfonos modernos decodifican H.264 usando H/w Acceleration. –

+0

@ OakBytes, quiero implementar la decodificación acelerada en H/W, sin embargo está hecho. Ahora solo sé cómo decodificar la transmisión con la decodificación del software ffmpeg. La aceleración de H/W se refiere al nivel de rendimiento a 1080P @ 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 el uso de 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 utilizan aceleración H/W? –

+0

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

Respuesta

22

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

OpenMAX Android utiliza OpenMAX para la interfaz de códec. Por lo tanto, todos los códecs nativos (hardware acelerado o no) proporcionan una interfaz OpenMAX. Esta interfaz es utilizada por StageFright (Framework de reproductores) para decodificar medios usando el códec

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

Ahora que se acerca a su pregunta How to tap native decoder to decode raw video bitstream?

En la versión Android 4.0 y por debajo, Android no proporcionar acceso a los decodificadores de vídeo subyacentes en la capa de Java. Debería escribir un 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 utilizando NDK.

En 4.1 (versión de 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 nuevas API en http://developer.android.com/about/versions/android-4.1.html#Multimedia

+0

Gracias por su aclaración sobre conceptos y respuestas. Revisé las referencias solo para encontrar que es muy cierto que debo profundizar en el sistema operativo. Esto definitivamente funcionaría. –

+0

Sin embargo, como sugiere la operación en Rockplayer, en la que eliminé todas las bibliotecas .so y la decodificación de hardware aún funciona mientras falla el software dec, podría haber una forma más simple de esto en la versión Android 4.0 y siguientes. En cuanto a mi decodificación de bitstream cruda y todo, podría tener que descubrir todo el asunto de OMX de todos modos. ¿Puedes dar la API de Java en Jelly Bean? –

+0

@Holygenn He agregado un enlace a las API de Media Player en Jelly Bean. En el caso de RockPlayer, ¿muestra video directamente usando decodificadores acelerados de hardware o le proporciona buffers de salida? Es más fácil hacer lo anterior que lo último con decodificadores acelerados por hardware –

0

Use ExoPlayer (github).

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

Incluye un buen demo app showing usage.

Cuestiones relacionadas