Androidvideo播放器使用NDK,OpenGL ES和FFmpeg

好吧,这是我到目前为止。 我已经在android上构build了FFmpeg,并且能够很好地使用它。 我已经能够从java端传递所选的文件名后,将video加载到FFmpeg。 为了节省性能,我在NDK中编写video播放器,而不是通过JNI将帧从FFmpeg传递给java。 我想从video发送帧到一个OpenGL的表面。 我无法弄清楚如何获取每帧video并将其渲染到OpenGL表面。 我一直在试图找出几个星期,现在没有运气。 希望有人能指出我正确的方向。

谢谢!

Solutions Collecting From Web of "Androidvideo播放器使用NDK,OpenGL ES和FFmpeg"

想到的一个方法是将帧的像素绘制成纹理,然后使用OpenGL渲染纹理。

我写了一篇博客文章,主要针对基于像素的老式video游戏,但也适用于您的情况。 这篇文章是C语言中的Android Native Coding ,我用一个例子设置了一个github仓库 。 使用这种技术,我已经能够获得60 FPS,即使在第一代硬件。

编辑有关glTexImage2D与glTexSubImage2D这种方法。

调用glTexImage2D将为您的纹理分配video内存,并将传递给它的像素复制到内存中(如果不传递NULL)。 调用glTexSubImage2D将更新您在已经分配的纹理中指定的像素。

如果你更新了所有的纹理,那么调用一个或另一个就没什么区别,实际上glTexImage2D通常更快。 但是如果你只更新纹理的一部分glTexSubImage2D在速度上胜出。

您必须使用2次幂的纹理大小,因此在高分辨率设备上覆盖屏幕需要1024×512的纹理和中等分辨率下的512×512纹理。 纹理比屏幕区域大(hi-res是800×400-ish),这意味着你只需要更新它的一部分,所以glTexSubImage2D就是要走的路。