android opengl-es ffmpeg android-ndk android-video-player

Reproductor de video Android que usa NDK, OpenGL ES y FFmpeg



opengl-es android-ndk (1)

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.

Hace un tiempo escribí una publicación en el blog sobre cómo hacerlo, principalmente para videojuegos antiguos basados ​​en píxeles, pero también se aplica a tu situación. La publicación es Android Native Coding en C , y configuro un repositorio de github con un ejemplo . Usando esta técnica, he podido obtener 60 FPS, incluso en hardware de primera generación.

EDITAR con respecto a glTexImage2D vs glTexSubImage2D para este enfoque.

Llamar a glTexImage2D asignará memoria de video para tu textura y copiará los píxeles que pases a esa memoria (si no pasas NULL). Al llamar a glTexSubImage2D se actualizarán los píxeles que especifique en una textura ya asignada.

Si actualiza toda la textura, entonces hay poca diferencia al llamar a una u otra, de hecho, glTexImage2D suele ser más rápido. Pero si solo actualiza parte de la textura, glTexSubImage2D gana velocidad.

Tiene que 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 (la alta resolución es 800x400-ish), lo que significa que solo necesita actualizar parte de ella, por lo que glTexSubImage2D es el camino a seguir.

Ok, así que aquí es lo que tengo hasta ahora. He construido FFmpeg en Android y puedo usarlo bien. He podido cargar un video en FFmpeg después de pasar el nombre de archivo elegido desde el lado de Java. Para ahorrar rendimiento, estoy escribiendo un reproductor de video en el NDK en lugar de pasar los marcos de FFmpeg a java a través de JNI. Quiero enviar cuadros desde el video a una superficie OpenGL. Estoy teniendo problemas para descubrir cómo obtener cada fotograma de video y representarlo en la superficie de OpenGL. He estado estancado tratando de resolver esto por un par de semanas sin suerte. Esperemos que alguien pueda apuntarme en la dirección correcta.

¡Gracias!