Android 如何将OpenGL上下文中的纹理复制到另一个上下文

Android 如何将OpenGL上下文中的纹理复制到另一个上下文,android,opengl-es,textures,surfaceview,android-mediacodec,Android,Opengl Es,Textures,Surfaceview,Android Mediacodec,我正在尝试在Android上使用MediaCodec,使用OpenGL ES 2上下文录制视频 为此,我希望使用可记录曲面,使用: private static final int EGL_RECORDABLE_ANDROID = 0x3142; 创建一个新的上下文。事实上,在我的第一个上下文中,我正在用纹理渲染一个场景。我想在新的上下文中呈现它,以便将数据发送到MediaCodec 我试着用 我在游戏中实现了InputSurface和GameRecorder,但我只录制了一个空场景 我的主要

我正在尝试在Android上使用MediaCodec,使用OpenGL ES 2上下文录制视频

为此,我希望使用可记录曲面,使用:

private static final int EGL_RECORDABLE_ANDROID = 0x3142;
创建一个新的上下文。事实上,在我的第一个上下文中,我正在用纹理渲染一个场景。我想在新的上下文中呈现它,以便将数据发送到MediaCodec

我试着用

我在游戏中实现了InputSurface和GameRecorder,但我只录制了一个空场景

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

如何在同一线程中发送最终图像渲染或整个场景以渲染,以避免线程问题,正确记录曲面?

首先查看中的“使用FBO记录GL应用程序”活动。它演示了三种不同的游戏视频录制方法(两种有效,另一种将来也会有效)

您可以创建一个EGL“共享组”,并将这两个上下文放在其中,这就是突破游戏录制器补丁和Grafika“Show+capture camera”活动所做的。使用
GLSurfaceView
会有点尴尬,因为您对上下文的生命周期没有太多的控制权,但是如果您想在方向更改期间保持录制状态并将其屏蔽,它就足够了

另一种方法是认识到
表面
是进程间缓冲队列的使用者端,即使渲染和录制发生在不同的线程中,实际上也不需要单独的上下文;相反,在同一个
EGLContext
中只需要两个
EGLSurface
实例。这就是“使用FBO记录总账应用程序”代码的工作原理。它使用一个普通的
SurfaceView
来获得对EGL上下文的完全控制,但是如果小心上下文管理,您应该能够使用
GLSurfaceView
执行类似的操作


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

您的上下文是在单独的线程中创建的吗?否,他们在同一条线上。OpenGL的线程尝试设置共享上下文。share_context指定另一个EGL呈现上下文,与之共享数据,该上下文由与上下文对应的客户端API定义。数据还与共享数据的所有其他上下文共享。EGL_NO_上下文表示不进行共享。