19.Qt的视频播放(QT篇) --- OpenCV从零开始到图像(人脸 + 物体)识别系列


本文作者:小嗷

微信公众号:aoxiaoji

吹比QQ群:736854977

简书链接:https://www.jianshu.com/u/45da1fbce7d0


1.前言

本文你会找到以下问题的答案:

  1. QT视频播放,控制视频的切换、停止、暂停、循环

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

1.视频播放

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

http://blog.csdn.net/gamesdev/article/details/8520955

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

2.pro文件中添加一行代码

根据教程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_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。

安装过程一路默认,我们看见视频上已经出现了这种标志后,双击可以播放,就说明成功了。

3.视频

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

4.视频播放

5.局部显示

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

6.ui设置

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

//ui里面的verticalLayout布局里添加控件videoWidget
ui->verticalLayout->addWidget(videoWidget);

7.效果图

实现了局部播放的效果了。

接着,我们实现三个槽函数,修改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_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();
}

8.修复bug及

上面的程序虽然实现了开始、暂停和停止,但有很多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();

9.效果图.PNG

修改mainwindow.h代码为:(就添加一个void bofangVideo();)

#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_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<QFileDialog>
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();

}

效果如下,实现了功能。

10.效果图2.PNG

11总结.png

  1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
  2. 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
  3. 写文章主要是为了后人少走点弯路,多交点朋友,一起学习
  4. 如果有好的图像识别群拉我进去QQ:631821577
  5. 就我一个白板,最后还是成的,你们别怕,慢慢来把

7.二维码

分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。

  • 邮箱:631821577@qq.com
  • QQ群:736854977
  • 有什么疑问公众号提问,下班或者周六日回答,ths

当初,小嗷是看《Qt5开发及实例.pdf》学习QT。当然也看QT论坛/csdn博主的相关文章,说说我对QT的看法吧。

当然,我会抽个时间把学习资源放到百度盘分享出去。大概就是小嗷的公众号,输入“资料”,自动弹出相关放置百度云盘的地址网页。

推荐文件:

11.VS2015+OpenCV3.2+QT软件/插件(QT篇1) — OpenCV从零开始到图像(人脸 + 物体)识别系列

12.QT + OpenCV打包成应用(以及QT图标问题详细) — OpenCV从零开始到图像(人脸 + 物体)识别系列

展开阅读全文

没有更多推荐了,返回首页