有没有办法将使用opengles 1.1渲染的游戏记录到MediaCodec的视频中?

时间:2013-12-22 07:08:17

标签: android opengl-es mediacodec

我正在使用opengles编写游戏,现在,我想在播放时录制一些帧。我目前的解决方案是在游戏结束后,我使用“glReadPixels”来获取我需要的部分的RGBA缓冲区并将RGBA转换为YUV420Plan格式或MediaCodec所需的其他格式,它完美地工作并在某些设备上生成h264流虽然不是所有设备,但因为有些问题here。我注意到这是从4.3开始重新编码来自opengl的视频的方法,即mEncoder.createInputSurface(),here is a sample。但是我不知道在将游戏渲染到自己的GLSurfaceView时如何将我的游戏渲染到这个表面。 有人能给我任何建议吗?

1 个答案:

答案 0 :(得分:3)

相关示例是Breakout recorder patch,它完全符合您的要求。我们的想法是创建两个EGL表面并将场景渲染两次。通过配置要共享的EGL表面,您可以共享许多GL对象,这使事情变得更加容易。

游戏是为GLES 2.x编写的,但我希望GLES 1.1能够正常工作。

在Nexus 4上,我可以获得60fps的游戏时间,同时以720p录制30fps的视频。我猜测,使用glReadPixels()并将软件转换为YUV,您的帧速率会低一些。

另一种游戏记录方法是将场景渲染为FBO纹理,然后渲染纹理两次(一次到GLSurfaceView,一次到MediaCodec输入面)。根据游戏的复杂性和架构,这可能会更快。

无论采用哪种方法,您都必须使用Android 4.3(API 18),因为这是Surface输入MediaCodec时的情况。

FWIW,如果您只想为演示录制一些视频,Android 4.4为开发人员添加了screen recording命令。

更新:您现在可以在Grafika中找到录制OpenGL ES的示例。 RecordFBOActivity以不同的方式完成它。