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

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

谢谢!

最佳答案
一种让人想起的方法是将你的框架的像素绘制到一个纹理,然后使用OpenGL渲染该纹理。

我写了一篇博客,一段时间后,如何去做这个,主要是用于老的基于像素的视频游戏,但它也适用于你的情况。这个帖子是Android Native Coding in C,我设置了一个github repository with an example.使用这种技术,我已经能够获得60 FPS,甚至在第一代硬件。

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

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

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

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

转载注明原文:Android视频播放器使用NDK,OpenGL ES和FFmpeg - 代码日志