【问题标题】:Rendering YUV format in android?在android中渲染YUV格式?
【发布时间】:2026-01-09 21:25:01
【问题描述】:

我正在尝试通过ffmpeg在android中流式传输视频,解码后得到的输出是YUV格式。是否可以直接在Android屏幕上渲染YUV图像格式?

【问题讨论】:

    标签: android android-ndk ffmpeg


    【解决方案1】:

    是和不是。

    摄像头和硬件视频解码器的输出一般是YUV。来自这些来源的帧通常直接发送到显示器。它们可以由驱动程序转换,通常使用硬件缩放器和格式转换器。这是提高效率所必需的。

    没有允许应用以相同方式传递 YUV 帧的 API。基本问题是“YUV”涵盖了很多领域。视频解码器使用的缓冲区格式可能是各种硬件模块可以高效处理的专有内部格式;为了让您的应用以这种格式创建表面,它必须执行转换,而您又回到了性能方面。

    您应该能够在前往显示器的途中使用 GLES2 着色器为您进行转换,但我没有指向演示此操作的代码的指针。

    更新:this question 的答案有一个指向 WebRTC source file 的链接,该链接演示了在 GLES2 着色器中进行 YUV 转换。

    【讨论】:

    • 感谢您的重播,实际上我正在使用 GLES1 进行尝试。您能帮我完成 GLES1 的工作吗,现在我已经准备好解码帧来渲染屏幕了
    • 着色器在 GLES2 之前不存在。 GLES1 可能有一种方法,但我不知道它是什么。
    • 由于YUV格式有很多,你能知道这些格式相关的东西,android到底支持哪些?
    • 问题在于 Surface 使用的 YUV 格式通常是专有的。有关 MediaCodec 输出的一些说明,请参阅 bigflake.com/mediacodec/#q5。 API 19 添加了 ImageReader 以直接访问 YUV,但这仅适用于相机输出。 MediaCodec 输出没有等价物,输入也没有等价物。如果您的目标 API 足够高,可以访问这些类,那么您最好还是使用 MediaCodec。
    • :感谢您的链接,它非常有用。我在这里所做的是通过 SWS_SCALE() 将解码的 YUV 帧转换为 RGB 并尝试渲染屏幕,但屏幕仍然是黑色的。