Android视频播放器使用NDK,OpenGL ES和FFmpeg

时间:2011-01-13 02:21:15

标签: android opengl-es ffmpeg android-ndk android-video-player

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

谢谢!

1 个答案:

答案 0 :(得分:21)

一种让人想到的方法是将帧的像素绘制到纹理中,然后使用OpenGL渲染该纹理。

我写了一篇关于如何解决此问题的博客文章,主要针对基于像素的老式视频游戏,但它也适用于您的情况。帖子为Android Native Coding in C,我设置了github repository with an example。使用这种技术,我甚至可以在第一代硬件上获得60 FPS。

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

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

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

你必须使用2次幂的纹理大小,因此在高分辨率设备上覆盖屏幕时需要1024x512纹理和中等分辨率的512x512纹理。纹理大于屏幕区域(高分辨率是800x400-ish),这意味着你只需要更新它的一部分,所以glTexSubImage2D就是你要去的地方。