如何以类似于相机为 SurfaceTexture 生成帧的方式生成 YUVI420 帧到 SurfaceTexture?

Posted

技术标签:

【中文标题】如何以类似于相机为 SurfaceTexture 生成帧的方式生成 YUVI420 帧到 SurfaceTexture?【英文标题】:How to produce YUVI420 frame to SurfaceTexture in similar manner like camera produces frames to SurfaceTexture? 【发布时间】:2020-03-02 13:34:49 【问题描述】:

我可以使用 openGL 在 GLSurfaceView 上渲染 YUVI420 帧,但我的要求是在 SurfaceTexture 上渲染帧。 基本上我想将帧生成到SurfaceTexture,而不是像渲染到TextureView 等,我有来自WebRTC 的YUV 数据流,我希望这个流在SurfaceTexture 中,以便稍后我可以在@987654327 中访问它@在消费者层面。 我找不到任何关于在 SurfaceTexture 上生成帧的来源。是否可以将 YUV 帧生成到 SurfaceTexure?

【问题讨论】:

【参考方案1】:

可以将YUVI420帧转成byteArray,在canvas上绘制,放到TextureView上

val canvas: Canvas = textureView.lockCanvas()
canvas.drawBitmap(sourceBitmap, 200f, 100f, Paint())
textureView.unlockCanvasAndPost(canvas)

【讨论】:

sourceBitmap 是 YUVI420 还是 RGB 帧? SurfaceTexture 的消费者可以使用它吗? sourceBitmap 是 YUVI420 但可以随时转换。我找到了这个问题/答案***.com/questions/30510928/… 嘿,我知道如何转换为 RGB,只需阅读 SurfaceTexture 的文档即可。 SurfaceTexture 使用 EXTERNAL_TEXTURE_OES,它使用 YUV 格式。转换为 RGB 操作缓慢,这不是解决此问题的方法,请参阅 SurfaceTexture。 TextureView 我知道如何使用 EGL Context 渲染 YUV 以及位图。 抱歉,在最初的问题中不清楚。只需要忽略 OpenGL 进行转换。但你是对的,我的结论不符合那个额外的要求。

以上是关于如何以类似于相机为 SurfaceTexture 生成帧的方式生成 YUVI420 帧到 SurfaceTexture?的主要内容,如果未能解决你的问题,请参考以下文章

通过 SurfaceTexture 在 GLSurfaceView 上显示相机流

使用 SurfaceTexture 和 OpenGL 修改相机输出

Android TextureView+SurfaceTexture实现相机预览

在具有目标 GL_TEXTURE_2D 的纹理上渲染相机预览

使用表面纹理的相机预览

Android 在相机框架上应用效果