繁体   English   中英

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

[英]Android Video Player Using NDK, OpenGL ES, and FFmpeg

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

谢谢!

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

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

编辑 glTexImage2D与glTexSubImage2D这种方法。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM