2

我正在用opengles编写游戏,现在,我想在玩的时候记录一些帧。我目前的解决方案是在游戏结束后,我使用“glReadPixels”来获取我需要的部分的 RGBA 缓冲区并将 RGBA 转换为 YUV420Plan 格式或 MediaCodec 所需的其他格式,它运行良好并在某些设备上生成了 h264 流,虽然不是所有设备,因为这里有些问题。而且我注意到这是从 4.​​3 开始从 opengl 重新编码视频的另一种方法,即 mEncoder.createInputSurface(),这是一个示例。但是在将游戏渲染到它自己的 GLSurfaceView 时,我不知道如何将我的游戏渲染到这个表面。谁能给我任何建议?

4

1 回答 1

3

相关示例是Breakout 记录器补丁,它完全符合您的要求。这个想法是创建两个 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 为开发人员添加了屏幕录制命令。

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

于 2013-12-22T17:28:11.487 回答