本文作者:小嗷
微信公众号:aoxiaoji
吹比QQ群:736854977
简书链接:https://www.jianshu.com/u/45da1fbce7d0
按界面上一个按钮之后,在界面上的一个固定的区域,显示一个装配动画视频,然后按另一个按钮,视频变成了另一个,界面用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
#include
//要包含下面的两个文件,必须在.pro文件中添加 QT += multimedia multimediawidgets
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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);
//1. 创建一个多媒体播放player
player = new QMediaPlayer;
//2. 创建一个视频播放控件videoWidget
videoWidget = new QVideoWidget;
//3. 设置中央小部件videoWidget
this->setCentralWidget(videoWidget);
//4. player设置输出控件videoWidget
player->setVideoOutput(videoWidget);
//5. player设置多媒体内容
player->setMedia(QUrl::fromLocalFile("D:\\colors.mp4"));
//6. 控件展示
videoWidget->show();
//7. 播放
player->play();
}
MainWindow::~MainWindow()
{
delete ui;
}
然后运行试试吧。
应用程序输出显示:
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中将这一行代码换成下面一行代码:
//ui里面的verticalLayout布局里添加控件videoWidget
ui->verticalLayout->addWidget(videoWidget);
实现了局部播放的效果了。
接着,我们实现三个槽函数,修改mainwindow.h代码为:(就是实现三个按钮的响应事件)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
//要包含下面的两个文件,必须在.pro文件中添加 QT += multimedia multimediawidgets
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
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);
//1. 创建一个多媒体播放player
player = new QMediaPlayer;
//2. 创建一个视频播放控件videoWidget
videoWidget = new QVideoWidget;
//3. 设置中央小部件videoWidget
ui->verticalLayout->addWidget(videoWidget);
//4. player设置输出控件videoWidget
player->setVideoOutput(videoWidget);
//5. player设置多媒体内容
player->setMedia(QUrl::fromLocalFile("D:\\colors.mp4"));
//6. 控件展示
videoWidget->show();
//7. 播放
player->play();
//以后,小嗷会说说信号与槽,886,不想讲
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(startVideo()));
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(pauseVideo()));
connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(closeVideo()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startVideo()
{
player->setMedia(QUrl::fromLocalFile("D:\\colors.mp4"));
videoWidget->show();
player->play();
}
void MainWindow::pauseVideo()
{
player->pause();
}
void MainWindow::closeVideo()
{
player->stop();
}
上面的程序虽然实现了开始、暂停和停止,但有很多bug,比较突出的三个是:
不能循环重复播放,播放完就变成黑屏了。
不能在暂停后恢复播放,只能从头播放。
只能播放一个视频,不能切换。
我们修改ui文件,添加一个按钮。
QMediaPlaylist类是多媒体播放表,可以添加媒体文件,并且设置循环播放。(有兴趣可以自己搞搞)
medialist->addMedia(QUrl::fromLocalFile("C:\\Users\\play.mp4"));
medialist->addMedia(QUrl::fromLocalFile("C:\\zhang.mov"));
player->setPlaylist(medialist);
medialist->setCurrentIndex(0);
videoWidget->show();
修改mainwindow.h代码为:(就添加一个void bofangVideo();)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
//要包含下面的两个文件,必须在.pro文件中添加 QT += multimedia multimediawidgets
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QMediaPlayer *player;
QVideoWidget *videoWidget;
//添加四个按钮的回调函数/槽函数
public slots:
void startVideo();
void pauseVideo();
void closeVideo();
void bofangVideo();
};
#endif // MAINWINDOW_H
修改mainwindow.cpp代码为:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
int i=0;
QString s;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//1. 创建一个多媒体播放player
player = new QMediaPlayer;
//2. 创建一个视频播放控件videoWidget
videoWidget = new QVideoWidget;
//3. 设置中央小部件videoWidget
ui->verticalLayout->addWidget(videoWidget);
//4. player设置输出控件videoWidget
player->setVideoOutput(videoWidget);
//5. player设置多媒体内容
player->setMedia(QUrl::fromLocalFile("D:\\test3Trim.mp4"));
//6. 控件展示
videoWidget->show();
//7. 播放
player->play();
//以后,小嗷会说说信号与槽,886,不想讲
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(startVideo()));
connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(pauseVideo()));
connect(ui->pushButton_3,SIGNAL(clicked()),this,SLOT(closeVideo()));
connect(ui->pushButton_4,SIGNAL(clicked()),this,SLOT(bofangVideo()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::startVideo()
{
player->setMedia(QUrl::fromLocalFile(s));
videoWidget->show();
player->play();
}
void MainWindow::pauseVideo()
{
//大家如果读过电子,看我定义这个i的时候,是不是像当初自己学单片机一样
//0代表暂停,1代表开始。然后,在清零。很久没写这么彩笔的写法
if(i==0){
player->pause();
i=i+1;
}else{
player->play();
i=0;
}
}
void MainWindow::closeVideo()
{
player->stop();
}
void MainWindow::bofangVideo(){
//获取文件选择路径(QFileDialog路径)
s = QFileDialog::getOpenFileName(this,"open file dialog","/","C++ files(*.cpp)::C files(*.c)::Head files(*.mp4)");
player->setMedia(QUrl::fromLocalFile(s));
player->play();
}
效果如下,实现了功能。
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
当初,小嗷是看《Qt5开发及实例.pdf》学习QT。当然也看QT论坛/csdn博主的相关文章,说说我对QT的看法吧。
当然,我会抽个时间把学习资源放到百度盘分享出去。大概就是小嗷的公众号,输入“资料”,自动弹出相关放置百度云盘的地址网页。
推荐文件:
11.VS2015+OpenCV3.2+QT软件/插件(QT篇1) — OpenCV从零开始到图像(人脸 + 物体)识别系列
12.QT + OpenCV打包成应用(以及QT图标问题详细) — OpenCV从零开始到图像(人脸 + 物体)识别系列