我有一个来自 FFMPEG 的 YUV 格式的 AVFrame。我想使用来自QOpenGLWidget和QOpenGLFunctions的qt派生类来渲染它。
我是qt和OpenGL的初学者。
有人可以帮忙吗?
谢谢 阿斯文
好吧,实际上,如果你需要实现一个真正快速渲染的播放器,你将不得不弄乱缓冲区优化,屏幕外渲染,缓冲区流 - 这些东西。但就您不熟悉Qt而言,有一些简单但有效的解决方案:
- 尝试AV_PIX_FMT_RGBA像素格式,将简单的纹理渲染成一些绘图表面矩形就足够简单了。
- 当我想自己尝试同样的事情时,找到了这个很棒的家伙,他在这里实现了完整的工作示例。
上面链接中的QFFmpegGLWidget类足以让你得到这个想法。转换为 RGB 是通过片段着色器完成的,这是应用了 3 种纹理的老技巧,GL_LUMINANCE在那里工作。
我努力使用自己的,几乎相似的解决方案,但是从相机(rtsp(中获取了错误,混乱的颜色的图像。因此,请确保您获得的是YUV420p格式的帧。如果其他像素格式更适合您,请查看这些中文资源以使其更深入(谷歌翻译使它们可读(:
- YUV 着色器转换
- YUV 2 RGB 数学
祝你好运!
对于这些情况,我使用自定义QQuickItem编写了一个演示。YUV 数据上传到 GPU 并使用 OpenGL 着色器进行转换。这是带有代码的存储库:https://github.com/carlonluca/qtyuv。