将TextureView上显示的帧记录到mp4

时间:2017-02-28 12:22:32

标签: android video opengl-es textureview

我设法在TextureView上编写了一个显示3D模型的演示,模型可以根据手机的传感器移动。 3D引擎是由C ++编写的,我需要做的是将TextureView的SurfaceTexture提供给3D引擎。     引擎调用函数ANativeWindow_fromSurface来检索本机窗口并在其上绘制3D模型。 3D引擎不是我想在这个问题中讨论的关键点。

现在我想将移动的3D模型录制到视频中。一种方法是使用GL_TEXTURE_EXTERNAL_OES纹理就像grafika一样,使3D引擎绘制框架到oes纹理,并在每次调用updateTexImage()之后将纹理内容绘制到屏幕。但是对于某些限制,我不允许使用这种方式。

我打算直接使用TextureView的SurfaceTexture。我认为诸如attachToGLContext()和detachFromGLContext()之类的函数对我的工作很有用。

有人能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

Grafika的“记录GL应用程序”有三种不同的操作模式:

  1. 两次画一遍。
  2. 渲染到屏幕外的pbuffer,然后两次blit。
  3. 绘制一次,然后在帧缓冲区之间复制(需要GLES 3)。
  4. 如果您可以配置渲染到的EGL表面,则方法2和3将起作用。对于方法#3,请记住,在调用eglSwapBuffers()之前,像素不会进入Surface(即Android Surface,而不是EGL曲面)。

    如果引擎代码正在管理EGL表面并为您调用eglSwapBuffers(),那么事情会更烦人。 SurfaceTexture附加/分离调用将允许您使用来自不同EGL上下文的输出访问GLES纹理,但渲染线程在渲染视图UI时需要它。我不完全确定这是怎么回事。