项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)

简介: 项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)

OpenCV开发专栏(点击传送门)

需求

使用OpenCV库的视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)。

原理

      使用OpenCV打开视频文件,获取总帧数,根据当前帧数,刷新当前时间戳与预期的时间间隔,调用槽函数动态刷新播放内容。

注意

      当前只测试了avi文件。

相关博客

OpenCV开发笔记(四):OpenCV图片和视频数据的读取与存储

项目实战:Qt视频播放器控件(不依赖系统编解码)

项目实战:Qt+OpenCV操作摄像头拍照、调节参数和视频录制

项目实战:Qt+OpenCV视频播放器(支持播放器操作,如暂停、恢复、停止、时间、进度条拽托等)

Qt实用技巧:使用QMediaPlayer和Windows自带组件播放swf、rmvb、mpg、mp4等视频文件

Qt实用技巧:使用QMediaPlayer播放mp4文件

Demo:OpenCVPlayer v1.0.0

运行效果

下载地址

CSDN:openCVPlayerv1.0.0.rar_qt中OpenCV中视频播放、暂停-QT其他资源-CSDN下载

核心类代码

OpenCVPlayerManager.h

#ifndef OPENCVPLAYERMANAGER_H
#define OPENCVPLAYERMANAGER_H
/************************************************************\
 * 控件名称: OpenCVPlayerManager,OpenCV管理类
 * 控件描述:
 *          1.OpenCV打开视频文件
 *          2.播放器操作:播放、暂停、停止
 *          3.播放时显示:当前时间、总时间
 *          4.设置当前播放的时间点
 *
 * 作者:红模仿    联系方式:QQ21497936
 * 博客地址:https://blog.csdn.net/qq21497936
 *       日期                版本               描述
 *   2019年11月25日      v1.0.0         opencv打开文件
\************************************************************/
#include <QObject>
#include <QImage>
#include <QTimer>
#include <QElapsedTimer>
// opencv
#include "opencv/highgui.h"
#include "opencv/cxcore.h"
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
class OpenCVPlayerManager : public QObject
{
    Q_OBJECT
public:
    enum PLAY_STATE {
        PLAY_STATE_PLAYING,
        PLAY_STATE_PAUSE,
        PLAY_STATE_STOP
    };
public:
    explicit OpenCVPlayerManager(QObject *parent = 0);
    ~OpenCVPlayerManager();
public:
    QString getWindowTitle() const;
public:
    void setWindowTitle(const QString &windowTitle);
signals:
    void signal_captureOneFrame(cv::Mat mat);           // 接收图像后抛出信号
    void signal_playStateChanged(OpenCVPlayerManager::PLAY_STATE playState);
                                                        // 播放器状态
    void signal_durationChanged(qint64 duration);       // 视频总长度
    void signal_positionChanged(qint64 position);       // 当前位置
public:
    bool startPlay(QString filePath, int width = 480, int height = 320);
    void pause();                       // 暂停
    void resume();                      // 恢复播放
    void stopPlay();                    // 停止播放
    void setPosition(qint64 position);  // 切换到播放位置
public slots:
    bool slot_start();                  // 开启线程
    bool stop();                        // 关闭线程
protected slots:
    void slot_captrueFrame();           // 消息循环获取图像
    void slot_stopPlay();               // 停止播放
    void slot_setPosition(qint64 position);
public:
    static QImage cvMat2QImage(const cv::Mat &mat);
private:
    cv::VideoCapture *_pVideoCapture;   // 播放文件实例
    QString _filePath;                  // 播放文件路径
    bool _running;                      // 线程是否运行
    int _totalFrames;                   // 总帧数
    int _fps;                           // 每秒帧数
    int _currentFrame;                  // 当前帧数
    int _width;                         // 高度
    int _height;                        // 宽度
    QElapsedTimer _elapsedTimer;        // 计时器
    qint64 _pauseMs;                    // 暂停的毫秒
    qint64 _duration;                   // 视频总长度(毫秒)
    PLAY_STATE _playState;              // 播放器状态
    int _position;                      // 改变到的播放位置
    bool _setPostion;                   // 播放位置修改标志
private:
    QString _windowTitle;
};
#endif // OPENCVPLAYERMANAGER_

入坑

入坑一:调整播放位置时,宕机

原因:

      直接主线程操作设置当前帧的位置,同时子线程也却在读取,OpenCV内部没有错异步处理。

解决方法:

      先调用设置位置,然后槽调用,将设置位置放置到子线程当中去。


相关文章
|
7月前
|
C++
基于Qt的简易音乐播放器设计与实现
基于Qt的简易音乐播放器设计与实现
300 0
|
5月前
|
C++
基于QT实现的拷贝文件以及实时进度条(简易版)
1.基于按钮或者菜单栏的槽里去写逻辑函数(我这边用的是菜单栏),ui实现的进度条 2.创建两个对象,一个是源文件,一个是目标文件分别用getopenfileName、getsavefileName函数即可。 3.利用QFile类去实现对两个文件的创建,因为QFile中可以获取文件的属性已经读写等。 4.循环的去读取源文件中的数据,然后写入目标文件
540 6
|
5月前
|
Linux 开发者 iOS开发
QT:基于QMediaPlayer制作的视频播放器(最下方有整合包,可直接运行)
QMediaPlayer是Qt多媒体模块中的一个核心类,它提供了播放音频和视频内容的功能。这个类的设计旨在简化跨平台的媒体播放,使得开发者能够在多种操作系统(如Linux、Windows、macOS及移动平台)上轻松集成多媒体播放能力到他们的应用中,而无需关心底层实现细节。以下是关于QMediaPlayer的一些关键点:
569 1
|
5月前
|
机器学习/深度学习 数据采集 算法
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
Python基于OpenCV和卷积神经网络CNN进行车牌号码识别项目实战
382 19
|
6月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
74 1
|
6月前
|
存储 Cloud Native Linux
OpenCV鼠标操作(画红色方框截取图像)
OpenCV鼠标操作(画红色方框截取图像)
|
6月前
|
计算机视觉
OpenCV图像像素逻辑操作
OpenCV图像像素逻辑操作
|
5月前
|
Linux 开发者 iOS开发
QT:基于QMediaPlayer制作的视频播放器(最下方有整合包,可直接运行)
QMediaPlayer是Qt多媒体模块中的一个核心类,它提供了播放音频和视频内容的功能。这个类的设计旨在简化跨平台的媒体播放,使得开发者能够在多种操作系统(如Linux、Windows、macOS及移动平台)上轻松集成多媒体播放能力到他们的应用中,而无需关心底层实现细节。以下是关于QMediaPlayer的一些关键点:
132 0
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像阈值操作 threshold】
【Qt&OpenCV 图像阈值操作 threshold】
65 0
|
7月前
|
Windows
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战
Qt 目录操作(QDir 类)及展示系统文件实战 & QFilelnfo 类介绍和获取文件属性项目实战