【问题标题】:Need to render YUV frame(AVFrame from ffmpeg) using QT QOpenGLWidget需要使用 QT QOpenGLWidget 渲染 YUV 帧(来自 ffmpeg 的 AVFrame)
【发布时间】:2019-03-11 14:59:28
【问题描述】:

我有一个来自 FFMPEG 的 YUV 格式的 AVFrame。我想使用来自 QOpenGLWidget 和 QOpenGLFunctions 的 qt 派生类来渲染它。

我是 qt 和 OpenGL 的初学者。

有人可以帮忙吗?

谢谢 阿斯温

【问题讨论】:

    标签: qt ffmpeg yuv qopenglfunctions


    【解决方案1】:

    好吧,实际上,如果您需要实现一个真正快速渲染播放器,您将不得不处理缓冲区优化、屏幕外渲染、缓冲区流——来自那些.但就 Qt 新手而言,有一些简单但有效的解决方案:

    1. 试试 AV_PIX_FMT_RGBA 像素格式,将简单的纹理渲染成一些绘图表面矩形就足够简单了。
    2. 当我想自己尝试相同的方法时,发现了这个很棒的家伙,他实现了full working example here

    上面链接中的 QFFmpegGLWidget 类足以让您了解这个想法。转换为 RGB 是通过片段着色器完成的,使用 GL_LUMINANCE 应用的 3 个纹理的好老技巧在那里工作。

    我在自己的几乎类似的解决方案上苦苦挣扎,但从相机 (rtsp) 中得到的图片颜色错误、混乱。因此,请确保您正在YUV420p 中获取帧。如果其他像素格式更适合您,请查看这些中文资源以更深入地了解它(谷歌翻译使它们可读):

    1. YUV shader conversions
    2. YUV 2 RGB math

    祝你好运!

    【讨论】:

    • 你的意思是说使用QFFmpegGLWidget并不是一个真正快速的渲染播放器吗?我认为这是最优化的方式。有没有更好的办法?
    • @LucasZanella 另一方面,我的意思是,对于大多数常见情况,这是最好的方法,到目前为止已经足够了。 AFAIK,如果有人要搞砸额外的,甚至是 heavy 优化,他可以尝试使用硬件加速(当然,通过新的 FFMPEG,例如手动预构建),它可以在某些YUV 以外的格式(例如,NV21,但差别不大,或其他)。此外,一些复杂的“缓冲流”技术可以进一步提高 OpenGL 性能——我没有尝试自己实现它们,但即使在 OpenGL 手册中也提到了它们。
    • @MasterAler 嘿,谢谢你的回答。看来QFFmpegVideoDecoder.cpp:218调用sws_scale先将AVFrame转为YUV420P,再使用shader进行进一步的转换。有没有办法跳过 sws_scale 直接在着色器中做所有事情?
    • @BoLi Yepp,当然。请检查我简陋的草图:github.com/MasterAler/SampleYUVRenderer 这会渲染解码器最常见的输出 YUV(需要一个不太明显的着色器),但如果您需要渲染 RGB,我也可以添加它(这很简单一个着色器,不过)。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 2013-12-27
    相关资源
    最近更新 更多