Android:将 SurfaceTexture 附加到 FrameBuffer

Posted

技术标签:

【中文标题】Android:将 SurfaceTexture 附加到 FrameBuffer【英文标题】:Android: Attach SurfaceTexture to FrameBuffer 【发布时间】:2016-02-05 18:24:50 【问题描述】:

我正在执行需要双通道渲染的视频效果(纹理需要通过多个着色器程序)。将 SurfaceTexture 附加到构造函数中传递的 GL_TEXTURE_EXTERNAL_OES 似乎不是解决方案,因为显示的结果只呈现一次。

我知道的一个解决方案是,可以对 FrameBuffer 进行第一次渲染,然后将生成的纹理渲染到实际显示的位置。

但是,似乎必须将 SurfaceTexture 附加到 GL_TEXTURE_EXTERNAL_OES 纹理,而不是 FrameBuffer。我不确定是否有解决方法,或者我是否应该采取不同的方法。

谢谢。

【问题讨论】:

【参考方案1】:

SurfaceTexture 接收图形数据的缓冲区并将其包装为“外部”纹理。如果查看源代码有帮助,请从updateTexImage() 开始。请注意,类的名称(“GLConsumer”)比“SurfaceTexture”更准确地描述了该函数:它消耗图形数据帧并使它们可用于 GLES。

SurfaceTexture 预计可以处理 OpenGL ES 不能“自然”处理的格式,尤其是 YUV,因此它总是使用外部纹理。

【讨论】:

相机帧进入surfaceTexture,但是图像帧的确切格式是什么?当我将图像绘制到 MediaCodec 的表面时,为什么编码器可以对帧进行编码而没有格式问题? 系统集成商必须确保图形和视频组件交互。 android 没有指定单一格式,只是 GLES 实现和视频编解码器需要能够共享缓冲区。 (因此COLOR_FormatSurface,a/k/a OMX_COLOR_FormatAndroidOpaque...这在数据结构意义上是“不透明的”,而不是 alpha 透明度意义上的。)这并不总是自动的,例如GLES 输出到 MediaCodec 需要 EGL_RECORDABLE_ANDROID 标志。 你的意思是系统集成商必须实现外部oes opengl扩展? 系统需要通过CTS,图文交互是测试套件的一部分。只要这些部分在最终产品中组合在一起,谁提供什么并不重要。

以上是关于Android:将 SurfaceTexture 附加到 FrameBuffer的主要内容,如果未能解决你的问题,请参考以下文章

android OpenGLES 1.x CameraPreview 到 Surfacetexture

音视频开发系列——详解Android SurfaceTexture

Android - 在 SurfaceTexture 上绘制 YouTube 视频

Android TextureView+SurfaceTexture实现相机预览

一文了解surface,surfaceview,surfaceTexture,GLsurfaceView

玩转Android Camera开发:使用TextureView和SurfaceTexture预览Camera 基础拍照demo