2014-02-10 69 views
3

我试图使用OpenGL ES 2上下文在Android上使用MediaCodec来记录视频。如何将OpenGL上下文中的纹理复制到另一个上下文

要做到这一点,我想用可记录表面上使用:

private static final int EGL_RECORDABLE_ANDROID = 0x3142; 

创建一个新的上下文。实际上,我在我的第一个上下文中渲染了一个场景。我想在新的上下文中渲染它以将数据发送到MediaCodec。

我试图做同样的thisRecording patch

我在游戏中的InputSurface和GameRecorder实现突破的教程,但我只能记录一个空的场景。

我的主要问题是,上下文不共享相同的OpenGL的对象,我不知道这样做的最佳解决方案。

我怎么能发送最终的图像渲染,或整个场景渲染在同一线程,以避免线程问题,以正确记录表面?

+0

您的上下文是否在单独的线程中创建? – Kimi

+1

不,他们在同一个线程中。 OpenGL的线程 – vgonisanz

+0

尝试设置共享上下文。 http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/eglCreateContext.html share_context 指定另一个用于共享数据的EGL呈现上下文,由客户端API定义的对应于上下文。数据也与share_context共享数据的所有其他上下文共享。 EGL_NO_CONTEXT表示不会发生共享。 –

回答

4

首先查看Grafika中的“FBO记录GL应用”活动。它演示了三种不同的方式来进行游戏视频录制(嗯,两个工作,一个将来会工作)。

您可以创建一个EGL“共享组”,并在其中放置两个上下文,这是Breakout游戏录像机补丁和Grafika“Show + capture camera”活动的作用。这与GLSurfaceView有些尴尬,因为您对上下文的生命周期没有太多的控制权,但是如果要在定位更改和屏蔽期间保持记录状态为活动状态,则它工作得很好。

另一种方法是识别Surface是进程间缓冲队列的消费者端,即使渲染和记录发生在不同的线程中,实际上也不需要单独的上下文;相反,你只需要EGLSurface的两个实例在相同的EGLContext。这就是“FBO记录GL应用”代码的工作原理。它使用一个普通的SurfaceView来完全控制EGL上下文,但是如果你对上下文管理小心的话,你应该可以使用类似GLSurfaceView的方法。

该活动演示Breakout(绘制场景两次)中使用的方法,第二种技术用于渲染FBO,然后将渲染结果进行blitting,第三种技术需要GLES3中的glBlitFramebuffer(),并且不适用于任何我尝试过的API 19设备。

相关问题