Qt中插入视频的方法很多,有QVideoPlayer方法,也有用Phonon的,本篇博客就是描述如何在一个QMainwindow界面中,划出一个区域,播放视频,并可以控制视频的切换、停止、暂停、循环,笔者会将遇到的坑一个个重述一遍,以作为后来者的学习资料。

最终的效果如下:

导师交给我一个任务,按界面上一个按钮之后,在界面上的一个固定的区域,显示一个装配动画视频,然后按另一个按钮,视频变成了另一个,界面用Qt做,在Windows7系统下,用Qt Creator来编,以方便后面移至到Linux系统上,使用深度学习的框架进行图像分类。

第一阶段:


首先遇到的问题是,用什么方法,网上教程很多,很多是QMediaPlayer的方法,也有用Phonon的,按照网上的教程来使用Phonon,程序都写完了,发现没有Phonon库,而在Qt5下面安装起来又很麻烦。由于Phonon不是Qt自己弄的,所以还是推荐使用QMediaPlayer模块配合。
http://blog.csdn.net/gamesdev/article/details/8520955


第二阶段:


按照网上的教程,我们新建一个Qt Creator的工程,命名为a,如图。

根据教程https://zhidao.baidu.com/question/561070081.html,我们首先在.pro文件中添加一行代码:

QT       += multimedia  multimediawidgets

然后,我们修改mainwindow.h中的代码:
我们添加了三个包含文件,增加了一个QMediaPlayer对象和一个QVideoWidget对象。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QUrl>
//要包含下面的两个文件,必须在.pro文件中添加  QT += multimedia  multimediawidgets
#include <QMediaPlayer>
#include <QVideoWidget>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QMediaPlayer *player;QVideoWidget *videoWidget;
};#endif // MAINWINDOW_H

我们在mainwindow.cpp中添加代码:
代码都浅显易懂,基本上不用解释。

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);player = new QMediaPlayer;videoWidget = new QVideoWidget;player->setVideoOutput(videoWidget);player->setMedia(QUrl::fromLocalFile("C:\\Users\\zhangping\\Videos\\play.mp4"));videoWidget->show();player->play();
}MainWindow::~MainWindow()
{delete ui;
}

然后运行试试吧。
可是:

完全没动静啊,怎么回事?
我想会不会是因为,我虽然建立一个videoWidget,但它和我的MainWindow窗口之间毫无联系,所以两者之间没有关系,MainWindow显示的同时,videoWidget不知道哪里去了。
打开我们的资源管理器,会发现,当qt程序运行的时候,在“应用”一栏有一个a.exe程序,如果我们关闭了前面那个MainWindow窗口,则应用栏的a消失,转而在后台进程中出现。

这就说明了,其实还有一个videoWidget没有显示出来,但它实际在运行!!!


第三阶段:


既然不显示,我们就把它添加到QMainwindow中吧。
在mainwindow.cpp中添加一行代码:

    this->setCentralWidget(videoWidget);

这回没有出现在上次那样,资源管理器中的后台进程有a.exe的现象了,但还是没有出现视频,应用程序输出显示:
DirectShowPlayerService::doRender: Unresolved error code 0x80040266 (IDispatch error #102)
经过度娘,我们得知需要下载安装一个解码器,我下载的是K-Lite_Codec_Pack_1370_Standard,已经传到了百度云盘,大家可以在https://pan.baidu.com/s/1eSeu3gm下载到,只有38M。
安装过程一路默认,我们看见视频上已经出现了这种标志后,双击可以播放,就说明成功了。

重新运行Qt程序,终于成功了!


第四阶段:


我希望用一个局部的窗口去显示,而不是整个程序界面都是(即不要全屏full screen),怎么办呢?经过度娘,我使用了VerticalLayout神器。在ui界面中拖进去一个Vertical Layout和三个按钮,分别是startButton,pauseButton,closeButton。

然后我们在mainwindow.cpp中将这一行代码换成下面一行代码:

 #原来的  this->setCentralWidget(videoWidget);ui->verticalLayout->addWidget(videoWidget);

再运行一下qt的程序,如下:

实现了局部播放的效果了。
接着,我们实现三个槽函数,修改mainwindow.h代码为:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QUrl>
//要包含下面的两个文件,必须在.pro文件中添加  QT += multimedia  multimediawidgets
#include <QMediaPlayer>
#include <QVideoWidget>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QMediaPlayer *player;QVideoWidget *videoWidget;public slots:void startVideo();void pauseVideo();void closeVideo();
};#endif // MAINWINDOW_H

修改mainwindow.cpp代码为:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);player = new QMediaPlayer;videoWidget = new QVideoWidget;ui->verticalLayout->addWidget(videoWidget);player->setVideoOutput(videoWidget);connect(ui->startButton,SIGNAL(clicked()),this,SLOT(startVideo()));connect(ui->pauseButton,SIGNAL(clicked()),this,SLOT(pauseVideo()));connect(ui->closeButton,SIGNAL(clicked()),this,SLOT(closeVideo()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::startVideo()
{player->setMedia(QUrl::fromLocalFile("C:\\Users\\zhangping\\Videos\\play.mp4"));videoWidget->show();player->play();
}void MainWindow::pauseVideo()
{player->pause();
}void MainWindow::closeVideo()
{player->stop();
}

第五阶段:


上面的程序虽然实现了开始、暂停和停止,但有很多bug,比较突出的三个是:

  1. 不能循环重复播放,播放完就变成空白了。
  2. 不能在暂停后恢复播放,只能从头播放。
  3. 只能播放一个视频,不能切换。

我们修改ui文件,添加两个按钮。
这次我们要使用QMediaPlaylist类,可以添加媒体文件,并且设置循环播放。

然后修改mainwindow.h代码为:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QUrl>
//要包含下面的两个文件,必须在.pro文件中添加  QT += multimedia  multimediawidgets
#include <QMediaPlayer>
#include <QVideoWidget>
#include <QMediaPlaylist>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();private:Ui::MainWindow *ui;QMediaPlayer *player;QVideoWidget *videoWidget;QMediaPlaylist *medialist;public slots:void startVideo_1();void startVideo_2();void resumeVideo();void pauseVideo();void closeVideo();
};#endif // MAINWINDOW_H

修改mainwindow.cpp代码为:

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);player = new QMediaPlayer;videoWidget = new QVideoWidget;medialist=new QMediaPlaylist;ui->verticalLayout->addWidget(videoWidget);player->setVideoOutput(videoWidget);medialist->addMedia(QUrl::fromLocalFile("C:\\Users\\zhangping\\Videos\\play.mp4"));medialist->addMedia(QUrl::fromLocalFile("C:\\Users\\zhangping\\Videos\\zhang.mov"));player->setPlaylist(medialist);medialist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);connect(ui->startButton_1,SIGNAL(clicked()),this,SLOT(startVideo_1()));connect(ui->startButton_2,SIGNAL(clicked()),this,SLOT(startVideo_2()));connect(ui->pauseButton,SIGNAL(clicked()),this,SLOT(pauseVideo()));connect(ui->resumeButton,SIGNAL(clicked()),this,SLOT(resumeVideo()));connect(ui->closeButton,SIGNAL(clicked()),this,SLOT(closeVideo()));
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::startVideo_1()
{medialist->setCurrentIndex(0);videoWidget->show();player->play();
}void MainWindow::startVideo_2()
{medialist->setCurrentIndex(1);videoWidget->show();player->play();
}void MainWindow::pauseVideo()
{player->pause();
}void MainWindow::resumeVideo()
{//player->
}void MainWindow::closeVideo()
{player->stop();
}

效果如下,实现了循环播放的功能了,但没有实现恢复播放的功能。

Qt中嵌入视频并循环播放方法相关推荐

  1. AVProVideo插件实现文件夹中的视频文件循环播放

    说明: 最近项目需要循环播放一个视频列表,使用的是[AVProVideo插件],发现只能一个视频的循环播放,不能实现一个文件夹下的所有视频的循环播放. 解决如下: 插件下载 提取码:bdgh 根据上图 ...

  2. html插入视频时不自动播放,html5中嵌入视频自动播放的问题解决

    在h5页面中嵌入视频的情况是比较多件的,有时候会碰到需要自动播放的情况,之前根本觉得这不是问题,但是自己的项目中需要视频的时候就有点sb了,达不到老板的要求,那个急呀~~~ 各种查资料,找到一个方法, ...

  3. html视频如何不自动播放,html5中嵌入视频自动播放的问题解决

    在H5页面中嵌入视频的情况是比较多件的,有时候会碰到需要自动播放的情况,之前根本觉得这不是问题,但是自己的项目中需要视频的时候就有点sb了,达不到老板的要求,那个急呀~~~ 各种查资料,找到一个方法, ...

  4. Qt中嵌入web网页的几种实现方式

    1.背景 Web网页的界面交互相比较Qt客户端而言有着比较大的优势:更加的多样化和更高的使用便捷性使得我们即使在客户端中也可以考虑将web网页嵌入到客户端的界面当中.如此便能将web的优势和客户端进行 ...

  5. 如何在您HTML中嵌入视频和音频

    by Abhishek Jakhar 通过阿比舍克·贾卡(Abhishek Jakhar) 如何在您HTML中嵌入视频和音频 (How to embed video and audio in your ...

  6. Aspose.Slides使用教程:使用 C++ 在 PowerPoint 演示文稿中嵌入视频

    目录 用于在 PowerPoint 演示文稿中嵌入视频的 C++ API 使用 C++ 在 PowerPoint 演示文稿中嵌入视频 在 PowerPoint 演示文稿中嵌入来自 Web 源的视频 使 ...

  7. 在QT中CXDVA视频组件的例子

    在QT中CXDVA视频组件的例子 在windows 平台下,cxdva视频组件可以在Qt.MFC等等框架中嵌入视频播放画面.cxdva视频组件使用起来很简单,只用简单的的调用三四个函数就可以实现播放视 ...

  8. 【在PowerPoint中插入视频的三种方法】

    为了能更好地帮助大家合理地在PowerPoint课件中插入和播放视频文件, 在PowerPoint中插入视频的三种方法 ,本文特向大家介绍PowerPoint中插入和处理视频的三种方法. 直接播放视频 ...

  9. 如何再html5中嵌入视频网站视频

    如何在html5中嵌入视频网站视频 比起运用"video"元素播放本地视频,直接嵌入视频网站的视频是一种既帅气又酷炫的方式.之前一直找不到正确方法把视频网站的视频嵌入html5,后 ...

最新文章

  1. php 文档标示规范,php标识
  2. malloc和new的区别是什么?
  3. Spring Boot AJAX 示例
  4. Bootstrap4+MySQL前后端综合实训-Day04-PM【PowerDesigner 图形化数据库设计软件(设置依赖关系、自动增长主键、生成sql语句)、SQLyog软件(备份数据库)】
  5. java 获取文件所在的文件夹_【Java视频教程】day32-文件IO??
  6. 【原创】“三次握手,四次挥手”你真的懂吗?
  7. 使用字节流复制一个文件夹
  8. 跨域资源请求(除jsonp以外)的方法
  9. 3dmax phoenix fd4.0汉化补丁_教你屏蔽 Win10 Flash 删除补丁 - Windows 10
  10. 请求发送者与接收者解耦——命令模式(五)
  11. 电脑罗盘时钟html怎么设置成桌面,抖音网红款Word Clock罗盘时钟电脑桌面屏保设置教程-完整版...
  12. 读书笔记:学习C语言必须读的第二本书
  13. avformat_seek_file函数介绍
  14. Zabbix系列:设置动态监控告警时间范围
  15. STM32F103ZE驱动PMW3901光流模块
  16. 锤子代工厂倒闭 老罗的“相声”还好笑吗
  17. Java图片处理 - 创建工具类
  18. 西电通院随机信号实验(FPGA实现2ASK键控、RC低通滤波器、Matlab实现SSB调制)
  19. “元宇宙”,究竟离我们有多远?(中)
  20. CET-4 高频核心 week1

热门文章

  1. Python初学-day1-python变量和基础数据类型
  2. java类的初始化方法_JAVA类初始化和实例初始化
  3. paypal创始人_Paypal创始人的一些经历
  4. 鸿蒙应用开发培训笔记04:UI页面设计与开发
  5. 《快速掌握PyQt5》第三十六章 用PyQtGraph绘制可视化数据图表
  6. 使用谷歌浏览器Chrome://inspect调试 cordova 项目
  7. 一个女程序员的征婚信息
  8. Docker学习:容器间数据挂载与共享 | 远程共享挂载数据卷 | sshfs挂载远程volume | 容器内部通过sshfs访问远程主机 | -v |--volumes-from(实战篇)
  9. 春节期间如何管理好你的亚马逊店铺之设置预售篇?
  10. 813-当你请求www.baidu.com时都发生了什么?