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

DRi*_*FTy 28 android ffmpeg opengl-es android-ndk android-video-player

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

谢谢!

ric*_*chq 21

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

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

编辑 glTexImage2D与glTexSubImage2D这种方法.

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

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

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

  • 我终于使用FFmpeg和OpenGL ES在屏幕上显示视频帧...如果有人对我如何工作感兴趣,请告诉我,我会尽力帮助.最后是使用FFmpeg正确的像素格式转换并将其映射到OpenGL中的正确像素格式以及使用正确的纹理坐标.但有一点是,与.mp4解码相比,手机上的.3gp解码速度非常慢.在原来的机器人上我只能得到~11fps.虽然机器人x产生了~22fps ......但仍在努力提高它. (4认同)