android video ffmpeg
http://www.rockplayer.com/download/rockplayer_ffmpeg_git_20100418.zip

¿La amistad ''Android+FFMpeg'' está realmente disponible?



video (3)

Compilé ffmpeg en Android. A partir de este punto, reproducir video depende puramente de la implementación, por lo que no es necesario medir latencias en cosas que pueden optimizarse en gran medida en el lugar que se necesita y no usar una escala de sonido estándar. Y sí, puedes construir un puente JNI fácil y usarlo en NDK para realizar llamadas ffmpeg, pero este ya sería un código de jugador.

La pregunta no significa que me interese si se puede usar el código ffmpeg en Andoid. Sé que puede. Solo estoy preguntando si alguien tiene el progreso real en el desempeño con esas cosas. He creado la pregunta después de varias semanas de experimentos con el material y ya he tenido suficiente ... No quiero escribir en sucursales donde las personas ni siquiera dicen qué tipo de video decodifican (resolución, códec) y hablan solo sobre algunos FPS místicos. Simplemente no entiendo lo que quieren hacer. Además, no voy a desarrollar aplicaciones solo para mi teléfono o para teléfonos con Android 2.2 ++ que tengan algunas características extendidas de OpenGL. Tengo un HTC Desire muy popular, así que si la aplicación no funciona, ¿qué sigue?

Bueno, ¿qué tengo?

  1. Fuente FFMpeg de la última rama HEAD. En realidad, no pude construirlo con NDK5, así que decidí usar el robado.

  2. Script de compilación de Bambuser (bash) con la fuente de ffmpeg apropiada ([web]: http://bambuser.com/r/opensource/ffmpeg-4f7d2fe-android-2011-03-07.tar.gz ). Se desarrolla bien después de algunas correcciones mediante el uso de NDK5.

  3. El código fuente ffmpeg de Rockplayer con enorme Android.mk en la capacidad de script de compilación ([web]: http://www.rockplayer.com/download/rockplayer_ffmpeg_git_20100418.zip ). Construye por NDK3 y NDK5 después de algunas correcciones. Rockplayer es probablemente el reproductor de medios más genial para Android y supuse que tendría algunas ventajas al usarlo.

Tenía un video adecuado para un proyecto (no es grande y no es pequeño): 600x360 H.264.

Las dos bibliotecas que obtuvimos de las cláusulas 2 y 3 nos brindan la posibilidad de obtener marcos de video (cuadro por cuadro, búsqueda, etc.). No intenté obtener una pista de audio porque no la necesitaba para el proyecto. No estoy publicando mi fuente aquí porque creo que es tradicional y es fácil de encontrar.

Bueno, ¿cuál es el resultado con el video? HTC Desire, Android 2.2 600x360, decodificación y renderización H.264 están en diferentes hilos

  1. Bambuser (NDK5 buld para armv5te, RGBA8888): 33 ms / promedio de trama.
  2. Rockplayer (construcción NDK3 para neón, RGB565): promedio de 27 ms / cuadro.

No está mal para el primer vistazo, pero solo piensa que estos son resultados solo para decodificar marcos. Si alguien tiene mejores resultados con el tiempo de decodificación, házmelo saber.

Lo más difícil para un video es renderizar. Si tenemos bitmap 600x360, debemos escalar uno de alguna forma antes de pintar, ya que los diferentes teléfonos tienen diferentes tamaños de pantalla y no podemos esperar que nuestro video tenga el mismo tamaño que la pantalla.

¿Qué opciones tenemos para reescalar un marco para adaptarlo a la pantalla? Pude consultar (el mismo teléfono y fuente de video) esos casos:

  1. sws_scale () Función C en la compilación de Bambuser: 70 ms / frame. Inaceptable.
  2. Estúpido cambio de mapa de bits en Android (Bitmap.createScaledBitmap): 65 ms / frame. Inaceptable.
  3. Representación de OpenGL en orto proyección en quad texturizado. En este caso, no necesité escalar el cuadro. Solo necesitaba preparar texturas de 1024x512 (en mi caso era RGBA8888) conteniendo píxeles de cuadros y luego cargarlos en GPU (gl.glTexImage2D). Resultado: ~ 220 ms / frame para renderizar. Inaceptable. No esperaba que glTexImage2D solo chupara la CPU de Snapdragon.

Eso es todo. Sé que hay alguna forma de usar el sombreador de fragmentos para convertir píxeles YUV usando GPU, pero tendremos el mismo glTexImage2D y 200 ms solo para cargar texturas.

Pero, este no es el final. ... mi único amigo al final ... :) No es una condición sin esperanza.

Al tratar de usar RockPlayer definitivamente te preguntarás cómo hacen esa maldita escala de fotogramas tan rápido. Supongo que tienen una muy buena experiencia en arquitectura ARM. Lo más probable es que utilicen avcodec_decode_video2 y que img_convert (como hice en la versión RP), pero luego usan algunos trucos (depende de la versión ARM) para escalar. Tal vez también tengan alguna configuración de buld "mágica" para ffmpeg que disminuya el tiempo de decodificación, pero Android.mk que publicaron no es THE Android.mk que usan. No sé...

Entonces, ahora parece que no puedes construir un puente JNI fácil para ffmpeg y tener un reproductor de medios real para la plataforma Android. Puede hacer esto solo si tiene un video adecuado que no necesita escalar.

¿Algunas ideas? Yo tengo esperanza en ti ;)



En mi experiencia, la conversión de YUV a RGB siempre ha sido un cuello de botella. Por lo tanto, el uso de un sombreador OpenGL para esto demostró dar un impulso significativo.