安卓OpenGL表面(GLSURFACEVIEW)的视频录制

9

我正在开展一个项目,需要记录渲染后的OpenGL表面。 (例如,如果我们使用GLsurfaceView,则需要记录该表面以及来自麦克风的音频)

目前,我正在使用MediaRecorder API,通过将视频源设置为VIDEO_SOURCE_GRALLOC_BUFFER

我正在使用以下示例作为基础代码。

我想知道....

  1. 这是正确的方法吗?是否有更好的替代方案?
  2. 链接中给出的示例测试记录EGLSURFACE的音频和视频,但未正确显示。

可能的原因是什么?
非常感谢任何帮助/指针。

谢谢,
萨蒂什

1个回答

18
您所引用的代码并非示例,而是内部测试代码,它使用了非公开的接口。在未来的发布版本中,SurfaceMediaSource 可能会发生更改或消失,并破坏您的代码。
更新: Android 4.3(API 18)允许将 Surface输入 MediaCodec EncodeAndMuxTest 示例演示了如何将OpenGL ES帧记录到.mp4文件中。 MediaRecorder 类不接收 Surface 输入,因此在您的情况下,您需要单独记录音频,然后使用新的 MediaMuxer 类将其合并。
更新 #2: Android 5.0(API 21)允许Surface输入到 MediaRecorder,这通常比使用 MediaCodec 更方便。如果您需要使用 MediaCodec,则有一个示例显示了使用它记录 OpenGL ES 输出的三种不同方法,在 Grafika 的“记录GL活动”中。 MediaProjection 类也可以用于屏幕录制。

嗨,谢谢提供信息。目前我们正在使用glreadpixels进行处理,但这降低了FPS。 - Satish.
刚刚登录只是为了说你是救命恩人。现在,继续寻找在iOS上实现它的方法。 - TatiOverflow
1
MediaRecorder的Surface Source非常有bug... https://dev59.com/v1UK5IYBdhLWcg3wwSLg - user924
@user924:你提到的代码创建了一个位图,并使用glTexImage2D()将其设置为纹理,但没有包含任何呈现纹理的代码。如果您不确定如何执行此操作,请使用[android]和[opengl-es]标签(可能还需要[grafika])提交新问题。 - fadden
@fadden 我有一些进展 https://github.com/google/grafika/issues/74#issuecomment-406852804 但是它绘制的位图带有黑色背景(即使我为画布设置了透明颜色),可能出了什么问题?附:我使用了这个克隆项目 https://github.com/crearo/grafika - user924
MediaRecorder的setInputSurface需要API 23。 - shuo Han

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接