自学内容网 自学内容网

2022-10-26 Qt6.5版本后视频渲染


前言

Qt 6版本中,视频播放能力得到了质的飞越,相对于qt5,变化也很多,具体变化可以看官方说明 https://www.qt.io/blog/qt-multimedia-in-qt-6

在Qt5版本中,如果需要播放一个视频,由于后端的解码能力很弱,绝大多数需要写解码的代码,但是在Qt6中,后端加入了ffmpeg,解码已经不是我们所需解决的问题,Qt Multimedia 可以很好的去播放视频
但是,在项目中大家可能不止会播放本地视频,很多情况下需要播放在线视频,比较低延时的rtsp流,udp裸流等等。对于需要实时性高的同学来说,qt的后端能力还是没有做好。这时还是需要自己处理视频流。

在Qt5时代,要播放一个低延时视频流,通常是使用ffmpeg自己解封装,解码视频流后,再将yuv/nv12等视频数据交给qt去渲染,问题是qt渲染能力低,很早大家使用sdl等工具去渲染视频,但由于sdl和qt各自使用自己的渲染事件,常会导致闪烁等问题,后来开始使用opengl,手写shader自己处理yuv数据,这个方案确实可行,效率也很高,但是得学习opengl相关知识。

但到了Qt6,新的QVideoSink,完全具备各视频的渲染,yuv,nv12等常见格式一点都不在话下,而且支持多种渲染方式,比如opengl和d3d11,d3d9等等,它主要是使用了Qt6的QRHI技术,有兴趣的同学可以去了解了解。

我这里主要讲讲如何使用ffmpeg解码+QVideoSink进行视频渲染播放


一、先上代码

1.将yuv/nv12等解码后的视频数据放入QVideoSink内

class VideoSourceRenderer : public QObject
{
   
    Q_OBJECT
    Q_PROPERTY(QVideoSink* videoSink READ videoSink WRITE setVideoSink NOTIFY videoSinkChanged)

public:
    VideoSourceRenderer()
    {
   
    }
    QVideoSink* videoSink() const
    {
   
return m_videoSink.get();
     }
    void  setVideoSink(QVideoSink* videoSink)
    {
   
if (m_videoSink == videoSink)
return;
m_videoSink = videoSink;
emit videoSinkChanged();
    }

signals:
    void videoSinkChanged();

原文地址:https://blog.csdn.net/ihmhm12345/article/details/140224581

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!