QT 使用QMediaPlayer实现的简易视频播放器

文章目录

QT 使用QMediaPlayer实现的简易视频播放器

效果图

功能点

  1. 播放指定视频
  2. 全屏/退出全屏
  3. 开始/暂停/重置视频
  4. 拖拽到指定位置播放

类介绍

  • 需要在配置文件中加入Multimedia, MultimediaWidgets这俩个库。
  • Multimedia:提供了一套用于处理音频、视频、摄像头和广播数据的API。
  • MultimediaWidgets:提供了一些与多媒体相关的图形界面组件。
  • QVideoProbe是Qt多媒体模块中的一个类,它用于监控视频流的输出。这个类允许你接收视频帧的数据,而不需要直接与视频输出设备交互。
  • QMediaPlayer 使用生产者-消费者模型来处理媒体内容。它从媒体源(如文件或网络流)获取数据,然后通过播放控制接口(如播放、暂停、停止)和播放状态接口(如当前播放位置、总时长)来控制媒体内容的播放。
  • 使用 QMediaPlayer时,通常需要将其与一个或多个媒体输出组件结合使用,例如QVideoWidget用于视频播放,QAudioOutput用于音频播放。

注意:在Qt6中使用QMediaPlayer时,使用的是setSource函数设置视频资源,而Qt5中并没有这个函数,使用的是setMedia函数。而且有个非常坑的地方,Qt6设置完QVideoWidget直接使用没有问题,而Qt5就会存在问题。

信息栏会报错:

复制代码
DirectShowPlayerService::doRender: Unresolved error code 0x80040266 

这极具迷惑性,当去百度时,你就会看到一堆让你LAV安装解码器的,安装后并没有什么用

最后看到Qt5一个官方的示例才解决,需要设置QVideoProbe

cpp 复制代码
    m_player = new QMediaPlayer(this);
    m_videoProbe = new QVideoProbe(this);
    m_videoProbe->setSource(m_player);

代码介绍

  1. 信号与槽
cpp 复制代码
    ///当QMediaPlayer的durationChanged信号发出时,Player类的durationChanged槽函数将被调用。durationChanged槽函数更新播放器的总时长。
    connect(m_player, &QMediaPlayer::durationChanged, this, &Player::durationChanged);
    ///当QMediaPlayer的positionChanged信号发出时,Player类的positionChanged槽函数将被调用。positionChanged槽函数通更新播放器的当前播放位置。
    connect(m_player, &QMediaPlayer::positionChanged, this, &Player::positionChanged);
    ///当移动进度条时,Player类的seek槽函数将被调用,从而改变媒体的播放位置。建立了媒体播放器进度条(QSlider)与播放器(Player)的连接
    connect(m_slider, &QSlider::sliderMoved, this, &Player::seek);
    //当点击进度条时,它将m_player的播放位置设置为点击处的值
    connect(m_slider, &ClickableSlider::clickedSlider, this, [&]()
            { m_player->setPosition(m_slider->value() * 1000); });
    //暂停/播放按钮
    connect(controlButton, &QPushButton::clicked, [&]()
            {
        if (m_player->state() == QMediaPlayer::PlayingState) {
            m_player->pause();
        } else {
            m_player->play();
        } });
    //退出按钮
    connect(eixtButton, &QPushButton::clicked, this, [&]()
            { close(); });
  1. 当前播放时间文本
  • 在槽函数positionChanged中被调用。
cpp 复制代码
void Player::updateDurationInfo(qint64 currentInfo)
{
    QString tStr;
    if (currentInfo || m_duration)
    {
        QTime currentTime((currentInfo / 3600) % 60, (currentInfo / 60) % 60,
                          currentInfo % 60, (currentInfo * 1000) % 1000);
        QTime totalTime((m_duration / 3600) % 60, (m_duration / 60) % 60,
                        m_duration % 60, (m_duration * 1000) % 1000);
        QString format = "mm:ss";
        if (m_duration > 3600)
            format = "hh:mm:ss";
        tStr = currentTime.toString(format) + " / " + totalTime.toString(format);
    }
    m_labelDuration->setText(tStr);
}
  1. 全屏
  • QVideoWidget有设置全屏的函数setFullScreen直接调用就行。
cpp 复制代码
void VideoWidget::mouseDoubleClickEvent(QMouseEvent *event)
{
    setFullScreen(!isFullScreen());
    event->accept();
}
  1. 点击进度条位置播放
  • 自定义一个进度条QSlider,重写点击函数,主动触发自定义clickedSlider信号,链接上述的信号与槽。
cpp 复制代码
void ClickableSlider::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton)
    {
        // 根据点击位置计算新的值
        qreal value = minimum() + ((qreal)(maximum() - minimum()) * event->pos().x()) / width();
        setValue(value);
        emit clickedSlider();
        event->accept();
    }
    QSlider::mousePressEvent(event);
}

总结

  • 知识理应共享,源码在此。
  • 这个案例功能相对简单,若是你想要更多功能,可以看看Qt案例
  • qt6与qt5的API使用方式还是不一样的,这点需要注意。
相关推荐
【余185381628003 分钟前
碰一碰发视频源码搭建定制化开发:支持OEM
音视频
EQ-雪梨蛋花汤5 分钟前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
追风赶月、10 分钟前
【QT】事件(鼠标、按键、定时器、窗口)
qt
xiaolang_8616_wjl36 分钟前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
WJ.Polar43 分钟前
Python数据容器-list和tuple
开发语言·python
FrostedLotus·霜莲1 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
超级码.里奥.农1 小时前
零基础 “入坑” Java--- 七、数组(二)
java·开发语言
KENYCHEN奉孝1 小时前
Rust征服字节跳动:高并发服务器实战
服务器·开发语言·rust
挺菜的1 小时前
【算法刷题记录(简单题)002】字符串字符匹配(java代码实现)
java·开发语言·算法
妮妮喔妮2 小时前
【无标题】
开发语言·前端·javascript