目录

一:视频播放效果展示

二:完整源码分享


一:视频播放效果展示

1.1 点击开始播放按钮,能够播放视频

1.2 点击暂停播放 视频停在某一帧画面 同时按钮文本改变为继续播放

      以便用户继续播放视频 提高用户使用体验感

点击暂停 可以停在某一帧画面

点击继续 可以继续播放视频

1.3 点击结束播放 就不再播放视频 同时结束播放按钮不可以再次点击

1.4 点击重新播放 可以播放新的一个视频

1.5 点击开始录制,从当前帧画面开始录制,并将录制视频保存在自己配置的文件夹目录下

点击录制,录制300ms

去自己配置文件夹下,可以查看到自己刚才录制下来的视频 并且双击打开能够正常播放

1.6 点击中断录制,可以随时停止录制视频

点击中断录制 如下图中断后只录制69ms

同样能够在自己配置的文件夹目录下 查看到 自己中断录制前所录制下来的视频

1.7 进度条拖拽 视频画面也跟随进度条拖拽进度进行更新播放

经过以上的测试,大致完成了本次的视频播放器的基本业务流程

二:完整源码分享

Qt  UI界面设计

源码分享

窗口类

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QImage>
#include<QDebug>
#include<opencv2/opencv.hpp>
#include"videothread.h"using namespace cv;
using namespace std;namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void paintEvent(QPaintEvent *arg);void videoinit(char *path);private:Ui::Widget *ui;QImage img;VideoThread *thread;//线程对象
public slots:void ChangeData(int current,Mat frame);
private slots:void on_startButton_clicked();//开始播放void on_pauseButton_clicked();//结束void on_stopButton_clicked();//暂停void on_replayButton_clicked();//重新播放void on_startRecordButton_clicked();//开始录制void on_stopRecordButton_clicked();//中断录制void on_horizontalSlider_sliderPressed();//按下进度条void on_horizontalSlider_sliderReleased();//松开进度条
};#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);videoinit("D:/000000000000000ffmpeg/那些年,我们一起追的女孩.mp4");
}Widget::~Widget()
{delete ui;
}void Widget::videoinit(char *path)
{//线程播放视频this->thread = new VideoThread(path);//进度条的初始化ui->horizontalSlider->setMinimum(0);ui->horizontalSlider->setMaximum(this->thread->getTotalpage());//进度条拖动范围ui->horizontalSlider->setRange(0,this->thread->getTotalpage());//进度条步长ui->horizontalSlider->setSingleStep(1);ui->horizontalSlider->setValue(0);//label初始化ui->totalPage->setText(QString::number(this->thread->getTotalpage()));ui->currentPage->setText(QString::number(0));connect(this->thread,SIGNAL(send2UI(int,Mat)),this,SLOT(ChangeData(int,Mat)),Qt::BlockingQueuedConnection);
}void Widget::paintEvent(QPaintEvent *arg)
{//视频播放显示ui->label->setPixmap(QPixmap::fromImage(this->img));
}void Widget::ChangeData(int current, Mat frame)
{this->img = QImage(frame.data,frame.cols,frame.rows,QImage::Format_RGB888);this->img = this->img.scaled(ui->label->width(),ui->label->height());ui->currentPage->setText(QString::number(current));ui->horizontalSlider->setValue(current);this->update();
}void Widget::on_startButton_clicked()
{this->thread->start();this->thread->setIsRun(true);qDebug()<<"thread start";
}void Widget::on_pauseButton_clicked()
{//如果当前的线程没有在执行if(this->thread->getIsRun() == false){//继续执行线程this->thread->resumeThread();ui->pauseButton->setText("暂停播放");}else{//点击暂停播放视频的按钮this->thread->pauseThread();//要设置可继续播放视频的按钮ui->pauseButton->setText("继续播放");}
}//点击结束播放
void Widget::on_stopButton_clicked()
{this->thread->stopThread();if(this->thread->isRunning() == false && this->thread != NULL){//解除信号槽的绑定disconnect(this->thread,SIGNAL(send2UI(int,Mat)),this,SLOT(ChangeData(int,Mat)));delete this->thread;this->thread = NULL;//设置不可以点击ui->stopButton->setEnabled(false);}
}//重新播放
void Widget::on_replayButton_clicked()
{this->thread->stopThread();
//    QThread::sleep(1);if(this->thread->isRunning() == false){//解除信号槽的绑定disconnect(this->thread,SIGNAL(send2UI(int,Mat)),this,SLOT(ChangeData(int,Mat)));delete this->thread;//播放新的一个视频videoinit("D:/000000000000000ffmpeg/中国合伙人.avi");this->thread->start();this->thread->setIsRun(true);}
}//开始录制
void Widget::on_startRecordButton_clicked()
{this->thread->setIsRecord(true);
}//中断录制
void Widget::on_stopRecordButton_clicked()
{this->thread->setIsRecord(false);
}//进度条按下
void Widget::on_horizontalSlider_sliderPressed()
{//暂停当前线程this->thread->pauseThread();}//进度条释放
void Widget::on_horizontalSlider_sliderReleased()
{//改变当前帧进度this->thread->setCurrentpage(ui->horizontalSlider->value());//继续线程this->thread->resumeThread();
}

视频线程类

#ifndef VIDEOTHREAD_H
#define VIDEOTHREAD_H
#include<QThread>
#include<QDebug>
#include<QString>
#include<QDateTime>
#include<opencv2/opencv.hpp>using namespace cv;
using namespace std;class VideoThread : public QThread
{Q_OBJECT
public:VideoThread(char *path);//总帧数int getTotalpage() const;void setTotalpage(int value);//当前帧进度int getCurrentpage() const;void setCurrentpage(int value);//录制bool getIsRecord() const;void setIsRecord(bool value);void run();//运行void pauseThread();//暂停void resumeThread();//继续void stopThread();//停止bool getIsRun() const;void setIsRun(bool value);private:VideoCapture cap;//视频对象VideoWriter writer;//写视频对象Mat frame;//当前每一帧的画面  一帧画面int totalpage;//视频总帧数int currentpage;//视频正在播放的当前帧数int pagenum;//录制的帧数int frame_width;//帧宽int frame_height;//帧高//暂停方法:1.锁对象QMutex 2.条件变量 3.标志位bool 是线程暂停bool isRun;//控线线程暂停bool isStop;//控制结束bool isRecord;//控制线程什么时候开始/结束录制
signals:void send2UI(int current,Mat frame);
};#endif // VIDEOTHREAD_H
#include "videothread.h"VideoThread::VideoThread(char *path):QThread()
{if(this->cap.open(path)){qDebug()<<"Video is open";//cap对象创建成功 路径成功 就可获取到视频总帧数this->totalpage = cap.get(CV_CAP_PROP_FRAME_COUNT);qDebug()<<"Video totalpage ="<<this->totalpage;//帧宽 帧高 的获取this->frame_width = cap.get(CV_CAP_PROP_FRAME_WIDTH);this->frame_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);}//当前帧this->currentpage = 0;//录制视频帧this->pagenum = 0;//运行this->isRun = false;//结束this->isStop = false;//录制this->isRecord = false;
}int VideoThread::getTotalpage() const
{return totalpage;
}void VideoThread::setTotalpage(int value)
{totalpage = value;
}int VideoThread::getCurrentpage() const
{return currentpage;
}void VideoThread::setCurrentpage(int value)
{currentpage = value;//拖动进度条 改变画面this->cap.set(CV_CAP_PROP_POS_FRAMES,this->currentpage);
}bool VideoThread::getIsRecord() const
{return isRecord;
}void VideoThread::setIsRecord(bool value)
{isRecord = value;//开始录制if(this->isRecord == true){QDateTime current_date_time = QDateTime::currentDateTime();QString filename = "./video/";filename += current_date_time.toString("yyyy_MM_dd_hh_mm_ss");filename += ".avi";qDebug()<<"filename = "<<filename;this->writer.open(filename.toStdString(),//视频文件名VideoWriter::fourcc('M','J','P','G'),//编码类型25,//帧率Size(this->frame_width,this->frame_height),//尺寸大小true);//彩色格式为true 灰度为false}
}void VideoThread::run()
{//控制线程停止while (this->isStop == false){//控线线程的暂停和继续if(this->isRun == true){//如果读到一帧if(cap.read(frame)){//当前帧数递增this->currentpage++;cvtColor(frame,frame,CV_BGR2RGB);emit send2UI(this->currentpage,frame);//开始录制if(this->isRecord == true){cvtColor(frame,frame,CV_BGR2RGB);//录制300msif(this->pagenum<300){this->writer.write(frame);this->pagenum++;qDebug()<<"Record pagenum = "<<pagenum;}else{//录制保存this->writer.release();//释放置零this->pagenum = 0;this->isRecord = false;}}else{//录制保存this->writer.release();this->pagenum = 0;}}//播放设置1ms 25帧msleep(40);}}cap.release();qDebug()<<"thread move away";
}//暂停视频播放
void VideoThread::pauseThread()
{qDebug()<<"pauseThread ";//如果当前线程正在执行if(QThread::isRunning()&&this->isRun == true){this->isRun = false;}
}//继续播放
void VideoThread::resumeThread()
{qDebug()<<"resumeThread ";//如果当前线程正在执行if(QThread::isRunning()&&this->isRun == false){this->isRun = true;}
}//结束播放
void VideoThread::stopThread()
{qDebug()<<"stopThread";//如果当前线程正在执行if(QThread::isRunning()&&this->isStop == false){this->isStop = true;QThread::quit();QThread::wait();QThread::exit();
//        QThread::terminate();}
}bool VideoThread::getIsRun() const
{return isRun;
}void VideoThread::setIsRun(bool value)
{isRun = value;
}

主入口测试

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

以上就是本次视频播放器的全部制作流程啦!欢迎一起学习!

C++ OpenCV制作视频播放器相关推荐

  1. OpenCV C++案例实战二十一《制作视频播放器》

    OpenCV C++案例实战二十一<制作视频播放器> 前言 一.源码 二.效果 总结 前言 本文将使用OpenCV C++ 制作简易视频播放器,用于实现视频播放基本功能. 1.通过创建滑动 ...

  2. python制作视频播放器_Python使用PyQT制作视频播放器!专属播放器~

    原标题:Python使用PyQT制作视频播放器!专属播放器~ 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用 ...

  3. 使用opencv开发视频播放器一

    最近由于项目需求,要在界面中内嵌一个简单的视频播放器,能够打开视频,逐帧播放,进度条拖动等功能. 因此,首先尝试使用opencv编写.原因:1.便于后续处理:2.opencv提高的接口较完善.很快就动 ...

  4. Opencv 简单视频播放器

    最近看了一下[1]_2011_OpenCV 2 Computer Vision Application Programming Cookbook.pdf,写了一个利用Opencv库实现的简单视频播放器 ...

  5. python制作视频播放器_Python应用03 使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  6. python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  7. Python使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  8. Python应用03 使用PyQT制作视频播放器

    最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...

  9. 移动软件开发-制作视频播放器

    一.实验目标 1.掌握视频列表的切换方法:2.掌握视频自动播放方法:3.掌握视频随机颜色弹幕效果. 二.实验步骤 一.实验准备: 1.1:先下载相应的播放图片,图片下载地址如下:https://gao ...

最新文章

  1. 8.Map集合(HashMapTreeMap)
  2. 提高你的Java代码质量吧:如果有必要,使用变长数组吧
  3. Python基础教程:in和not in操作
  4. 谭浩强课后题之----输出10个数中最大的
  5. 消息发送样例介绍和步骤分析
  6. 【每日一题】7月7日题目精讲—最短路
  7. ChaiNext:ETH底部试探后反弹,测试1500关口
  8. HDU 3441 Rotation
  9. python3哪个版本稳定-python的哪个版本稳定
  10. 反编译获取线上任何微信小程序源码(转)
  11. 程序员!你还能年轻几岁?
  12. 数据分析 超市条码_超市小程序做得比较好的功能点是什么?
  13. 解决微擎框架出现Could not resolve: cloud.zhifun.cc (Domain name not found)问题
  14. axure中继器求和_Axure学习笔记:中继器之价格统计
  15. Javafx中切换输入法
  16. EOS智能合约开发系列(五): 配置VS Code
  17. 权重衰减weight_decay参数从入门到精通
  18. 设计神经网络的基本原则,神经网络设计与实现
  19. 生活篇之工资和年终奖的纳税
  20. 关于1-100中3的倍数的数字

热门文章

  1. mac上投屏android_一行指令搞定 MacOS 下糟糕的安卓投屏体验
  2. 基于微信求职招聘小程序系统设计与实现 开题报告
  3. 【个人笔记】《知了堂》ajax的get及post请求
  4. 高精度升压型、降压型 LED 恒流驱动器 OC6701
  5. MFC显示Mat图片
  6. python怎么读取txt文件并统计其字数-python读写excel等数据文件方法汇总
  7. python统计csdn个人博客文章清单及字数
  8. 解析.msh或.cas文件
  9. Macbook玩机新手入门
  10. java转发乬数据,Java流编程实例及代码