从零开始学Qt(94):开发视频播放器实例

使用QMediaPlayer可以进行视频文件解码,视频播放必须将视频帧在某个界面组件上显示, 有QVideoWidget和QGraphicsVideoItem两种视频显示组件,也可以从这两个类继承,自定义视频显示组件。

QMediaPlayer也可以结合QMediaPlaylist实现视频文件列表播放。

1.视频播放器实例程序

QVideoWidget是用于显示视频的界面组件,要在项目中使用QVideoWidget,需要在项目配置 文件中添加下面一行语句:

Qt = multimediawidgets

使用QMediaPlayer和QVideoWidget实现的一个视频播放器实例程序,运行时界面如下图所示。该程序没有使用QMediaPlaylist,只播放单个文件。

从零开始学Qt(94):开发视频播放器实例

界面的主体部分是一个QmyVideoWidget类组件,是从QVideoWidget继承的自定义视频显示组件,重载了mousePressEvent()事件,鼠标单击可以暂停或继续播放;重载了keyPressEvent()事件,在全屏状态下按ESC键可以退出全屏。原始的QVideoWidget类没有这些功能。

2.主窗口设计

主窗口是基于QMainWindow的类MainWindow,采用UI设计器设计界面。在设计视频显示组件时,在窗体上放置一个QWidget组件,然后提升为QmyVideoWidget类。

主窗口功能主要是使用一个QMediaPlayer组件播放单个视频文件。媒体播放类QMediaPlayer的功能在介绍音频播放时(从零开始学Qt(92):使用QMediaPlayer播放音乐文件)已经详细介绍。

MainWindow类定义如下(忽略了自动生成的界面组件的槽函数定义):

class MainWindow : public QMainWindow{ Q_OBJECTpublic: MainWindow(QWidget *parent = nullptr); ~MainWindow();private: Ui::MainWindow *ui; QMediaPlayer *player;//视频播放器 QString durationTime; QString positionTime;private slots: //自定义槽函数 void onStateChanged(QMediaPlayer::State state); void onDurationChanged(qint64 duration); void onPositionChanged(qint64 position);};

MainWindow类的功能实现代码如下,只播放单个文件,比音频播放器功能简单,所以具体代码的功能这里不再赘述。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow){ ui->setupUi(this); player = new QMediaPlayer(this);//创建视频播放器 、 player->setNotifyInterval(2000);//信息更新周期 2000 ms player->setVideoOutput(ui->videoWidget); //视频显示组件 ui->videoWidget->setMediaPlayer (player) ;//设置显示组件的关联播放器 connect(player,SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(onStateChanged(QMediaPlayer::State))); connect(player,SIGNAL(positionChanged(qint64)), this, SLOT(onPositionChanged(qint64))); connect(player,SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64)));}void MainWindow::onStateChanged(QMediaPlayer::State state){//播放器状态变化 ui->btnPlay->setEnabled(!(state==QMediaPlayer::PlayingState)); ui->btnPause->setEnabled(state==QMediaPlayer::PlayingState); ui->btnStop->setEnabled(state==QMediaPlayer::PlayingState);}void MainWindow::onDurationChanged(qint64 duration){//文件时长变化 ui->sliderPosition->setMaximum(duration); int secs=duration/1000;//秒 int mins=secs/60; //分钟 secs=secs % 60;//余数秒 durationTime=QString::asprintf("%d:%d",mins,secs); ui->labRatio->setText(positionTime "/" durationTime);}void MainWindow::onPositionChanged(qint64 position){//文件播放位置变化 if(ui->sliderPosition->isSliderDown()) return; //如果正在拖动滑条,退出 ui->sliderPosition->setSliderPosition(position); int secs=position/1000;//秒 int mins=secs/60; //分钟 secs=secs % 60;//余数秒 positionTime=QString::asprintf("%d:%d",mins,secs); ui->labRatio->setText (positionTime "/" durationTime);}

几个按钮的相应代码如下:

void MainWindow::on_btnOpen_clicked(){//打开文件 QString curPath=QDir::homePath(); //获取系统当前目录 QString dlgTitle="选择视频文件"; //对话框标题 QString filter="wmv(*.wmv);;mp4(*.mp4);;(*.*)"; QString aFile=QFileDialog::getOpenFileName(this, dlgTitle, curPath, filter); if(aFile.isEmpty()) return; QFileInfo fileInfo(aFile); ui->labMedia->setText(fileInfo.fileName()); player->setMedia(QUrl::fromLocalFile(aFile));//设置播放文件 player->play();}void MainWindow::on_btnPlay_clicked(){//播放 player->play();}void MainWindow::on_btnPause_clicked(){//暂停 player->pause();}void MainWindow::on_btnStop_clicked(){//停止 player->stop();}void MainWindow::on_sliderPosition_valueChanged(int value){//播放位置 player->setPosition(value);}void MainWindow::on_btnMute_clicked(){//静音按钮 bool mute=player->isMuted(); player->setMuted(!mute); if(mute) ui->btnMute->setText("√"); else ui->btnMute->setText("×"); }void MainWindow::on_sliderVolumn_valueChanged(int value){//调节音量 player->setVolume(value);}void MainWindow::on_btnFullScreen_clicked(){//全屏按钮 ui->videoWidget->setFullScreen(true);}

3.自定义视频显示组件QmyVideoWidget

原始的QVideoWidget在全屏后无法按Esc键退出全屏状态,为了实现按键和鼠标控制功能,从QVideoWidget继承了一个类QmyVideoWidget,其定义如下:

class QmyVideoWidget : public QVideoWidget{private: QMediaPlayer *thePlayer;protected: void keyPressEvent(QKeyEvent *event); void mousePressEvent(QMouseEvent *event);public: QmyVideoWidget(QWidget *parent = Q_NULLPTR); void setMediaPlayer(QMediaPlayer *player);};

私有变量thePlayer是关联的视频播放器,在开始播放之前由主窗口程序调用setMediaPlayer()进行设置,以便在QmyVideoWidget里对播放器进行控制。

下面是QmyVideoWidget类的实现代码:

void QmyVideoWidget::keyPressEvent(QKeyEvent *event){//按键事件,ESC退出全屏状态 if((event->key() == Qt::Key_Escape) && ( isFullScreen() ) ){ setFullScreen(false); event->accept(); QVideoWidget::keyPressEvent(event); }}void QmyVideoWidget::mousePressEvent(QMouseEvent * event){//鼠标事件,单击控制暂停和继续播放 if(event->button()==Qt::LeftButton){ if(thePlayer->state()==QMediaPlayer::PlayingState) thePlayer->pause(); else thePlayer->play(); } QVideoWidget::mousePressEvent(event);}void QmyVideoWidget::setMediaPlayer(QMediaPlayer *player){//设置播放器 thePlayer=player;}

————————————————

觉得有用的话请关注点赞,谢谢您的支持!

对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2024年5月2日 上午8:14
下一篇 2024年5月2日 上午8:25

相关推荐

  • 科研项目包含哪些测评测试报告科研项目包含哪些测评测试报告

    科研项目包含哪些测评测试报告 科研项目通常包含多个测评测试报告,用于评估项目的进展和成果。这些测评测试报告可能包括定量测评,如问卷调查或数据分析,也可能包括定性测评,如访谈或焦点小…

    科研百科 2024年9月9日
    20
  • 水利工程的项目管理

    水利工程的项目管理 水利工程是现代社会不可或缺的一部分,它对于保障水资源的供应和改善生态环境都有着重要的作用。水利工程的项目管理是其中一个重要的环节,它需要遵循一系列的规范化流程和…

    科研百科 2024年9月25日
    23
  • 面试被细问学术科研经历时,如何输出有效内容?(学术科研经历怎么写)

    "我看到你的简历中写到曾经参加过✖✖✖,可以简单介绍一下吗?" 在科研竞赛、实践项目等方面所取得的荣誉奖项以及学术论文发表经历等是保研中重要的加分项,作为锦上添…

    科研百科 2024年4月20日
    78
  • 施工网络进度计划图软件

    施工网络进度计划图软件介绍 随着现代建筑行业的迅速发展,施工网络进度计划图软件成为了施工过程中必不可少的工具。施工网络进度计划图软件能够为施工管理人员提供实时的进度数据支持,帮助他…

    科研百科 2024年5月23日
    45
  • 科研项目管理智能化系统

    科研项目管理智能化系统:提升科研效率,助力科技创新 随着科技的不断发展,科研项目管理已经成为了一个越来越重要的领域。传统的科研项目管理方式不仅效率低下,而且容易出现漏洞和错误,从而…

    科研百科 2024年8月12日
    39
  • 重大项目管理系统哪家好

    重大项目管理系统哪家好? 随着企业竞争的加剧,越来越多的企业开始重视项目管理的重要性。而重大项目管理系统作为项目管理的核心工具之一,则成为了企业必不可少的一部分。但是,在选择重大项…

    科研百科 2024年7月14日
    37
  • 单机版档案管理系统优势及应用场景(单机版档案管理软件)

    本文介绍了单机版档案管理系统的概念、优势、应用场景、开发流程和注意事项,并探讨了该技术的未来趋势,旨在帮助您更好地了解和选择单机版档案管理系统开发服务。 1.单机版档案管理系统概述…

    科研百科 2024年7月26日
    43
  • 南昌市水利综合服务中心召开南昌智慧水利信息管理系统建设项目推进会

    【来源:南昌市水利局_基层之窗】 2022年9月29日,市水利综合服务中心召开南昌智慧水利信息管理系统建设项目推进会,市水利局四级调研员邹幸主持会议,四川同创建设工程管理有限公司、…

    科研百科 2022年12月4日
    135
  • 国有企业13中重要廉洁

    国有企业是中国经济的重要组成部分,也是中国市场经济的核心力量。然而,随着中国经济的快速发展,国有企业也面临着一些廉洁问题。因此,国有企业13中的重要廉洁问题成为了当前中国经济改革和…

    科研百科 2024年11月8日
    0
  • 安全经费管理办法

    安全经费管理办法 为加强安全管理,保障公共安全,制定本管理办法。 第一章 总则 第一条 为加强安全管理,保障公共安全,根据《中华人民共和国宪法》、《中华人民共和国刑法》、《中华人民…

    科研百科 2024年8月18日
    21