Reproductor de Vídeo Android con NDK, OpenGL ES y FFmpeg


Ok así que esto es lo que tengo hasta ahora. He construido FFmpeg en android y soy capaz de usarlo bien. He podido cargar un video en FFmpeg después de pasar el nombre de archivo elegido desde el lado java. Para ahorrar en rendimiento estoy escribiendo reproductor de vídeo en el NDK en lugar de pasar fotogramas de FFmpeg a java a través de JNI. Quiero enviar fotogramas del vídeo a una superficie OpenGL. Estoy teniendo problemas para averiguar cómo obtener cada fotograma de video y renderizarlo en la superficie OpenGL. He sido atrapado tratando de resolver esto por un par de semanas sin suerte. Espero que alguien pueda guiarme en la dirección correcta.

Gracias!

Author: genpfault, 2011-01-13

1 answers

Una forma que viene a la mente es dibujar los píxeles de su marco en una textura y luego renderizar esa textura usando OpenGL.

Escribí una entrada de blog hace un tiempo sobre cómo hacer esto, principalmente para los videojuegos basados en píxeles old-skool, pero también se aplica a su situación. El post es Codificación nativa de Android en C, y configuré un repositorio de github con un ejemplo. Usando esta técnica he podido conseguir 60 FPS, incluso en la primera generación hardware.

EDITAR con respecto a glTexImage2D vs glTexSubImage2D para este enfoque.

Llamar a glTexImage2D asignará memoria de vídeo para su textura y copiará los píxeles que pase a esa memoria (si no pasa NULL). Llamar a glTexSubImage2D actualizará los píxeles que especifique en una textura ya asignada.

Si actualizas todo de la textura, entonces hay poca diferencia llamando a uno u otro, de hecho glTexImage2D suele ser más rápido. Pero si solo actualiza parte de la textura glTexSubImage2D gana en velocidad.

Debe usar tamaños de textura de potencia de 2, por lo que para cubrir la pantalla en dispositivos de alta resolución se requiere una textura de 1024x512 y una textura de 512x512 en resoluciones medias. La textura es más grande que el área de la pantalla (hi-res es 800x400-ish), lo que significa que solo necesita actualizar parte de ella, por lo que glTexSubImage2D es el camino a seguir.

 21
Author: richq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-14 08:33:54