当前,我正在使用Camera2 API,并已设法将摄像机帧处理移至OpenGL上下文(当前仅用于预览);为此,我将Renderer
绑定到GlTextureView
(GlSurfaceView
的克隆,但从TextureView
扩展而来),创建一个SurfaceTexture
,当我想显示预览-我只是将一个Surface
实例传递到已经提到的SurfaceTexture
的构造函数中,并将其提供给createCaptureSession
实例的CameraDevice
方法。
但是当我想使用Renderer
编码器记录MediaCodec
对象正在处理的帧时,就会出现问题。
据我所知-我必须将与EglContext
的{{1}}对应的Renderer
与创建的表面纹理ID一起传递给编码线程,然后创建一个Thread
“代理”,它将映射到SurfaceTexture
已经渲染的相同纹理。
但是令我困惑的是如何实际绑定 Renderer
和MediaCodec
:在GPUVideo项目中,纹理ID只是传递给了视频编码外观对象来自SurfaceTexture
,而固有的OpenGL程序(顶点着色器和片段着色器对)可以工作并重新处理纹理,再次重复Renderer
已经执行的所有步骤。
Grafika的作用几乎相同:视频记录系统使用它自己的OpenGL程序,并使用Renderer
重绘场景。
我的问题是,为什么这些项目中的编码器使用固有的OpenGL程序来处理纹理,以及是否有可能在GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, firstVertex, vertexCount)
实例中一次执行一次纹理以提供预览和记录处理?