简易视频播放器2 (基于Qt、opencv)
因项目需要,需要实现一个对以保存的监测视频快速查看功能。
查询网上一些资料,初步简易的实现了一下。
实际效果图:

该程序基于Qt5.4,opencv248,开发环境为win8.1
结构为:
- videoplayer.ui
- videoplayer.h
- videoplayer.cpp
由类 class VideoPlayer : public QWidget
实现 播放、暂停、进度条、播放速度等功能
代码
首先是界面:

即 ui_videoplayer.h
/********************************************************************************
** Form generated from reading UI file 'videoplayer.ui'
**
** Created by: Qt User Interface Compiler version 5.4.1
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#ifndef UI_VIDEOPLAYER_H
#define UI_VIDEOPLAYER_H
#include <QtCore/QVariant>
#include <QtWidgets/QAction>
#include <QtWidgets/QApplication>
#include <QtWidgets/QButtonGroup>
#include <QtWidgets/QComboBox>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QHeaderView>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QSlider>
#include <QtWidgets/QSpacerItem>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_VideoPlayer
{
public:
QWidget *verticalLayoutWidget;
QVBoxLayout *verticalLayout;
QSlider *horizontalSlider;
QHBoxLayout *horizontalLayout;
QPushButton *pushButton;
QPushButton *pushButton_2;
QLabel *label;
QLabel *label_2;
QSpacerItem *horizontalSpacer;
QLabel *label_3;
QComboBox *comboBox;
void setupUi(QWidget *VideoPlayer)
{
if (VideoPlayer->objectName().isEmpty())
VideoPlayer->setObjectName(QStringLiteral("VideoPlayer"));
VideoPlayer->resize(640, 560);
verticalLayoutWidget = new QWidget(VideoPlayer);
verticalLayoutWidget->setObjectName(QStringLiteral("verticalLayoutWidget"));
verticalLayoutWidget->setGeometry(QRect(10, 490, 621, 65));
verticalLayout = new QVBoxLayout(verticalLayoutWidget);
verticalLayout->setSpacing(6);
verticalLayout->setContentsMargins(11, 11, 11, 11);
verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
verticalLayout->setContentsMargins(0, 0, 0, 0);
horizontalSlider = new QSlider(verticalLayoutWidget);
horizontalSlider->setObjectName(QStringLiteral("horizontalSlider"));
horizontalSlider->setOrientation(Qt::Horizontal);
horizontalSlider->setInvertedControls(false);
horizontalSlider->setTickPosition(QSlider::NoTicks);
verticalLayout->addWidget(horizontalSlider);
horizontalLayout = new QHBoxLayout();
horizontalLayout->setSpacing(6);
horizontalLayout->setObjectName(QStringLiteral("horizontalLayout"));
pushButton = new QPushButton(verticalLayoutWidget);
pushButton->setObjectName(QStringLiteral("pushButton"));
horizontalLayout->addWidget(pushButton);
pushButton_2 = new QPushButton(verticalLayoutWidget);
pushButton_2->setObjectName(QStringLiteral("pushButton_2"));
horizontalLayout->addWidget(pushButton_2);
label = new QLabel(verticalLayoutWidget);
label->setObjectName(QStringLiteral("label"));
horizontalLayout->addWidget(label);
label_2 = new QLabel(verticalLayoutWidget);
label_2->setObjectName(QStringLiteral("label_2"));
horizontalLayout->addWidget(label_2);
horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
horizontalLayout->addItem(horizontalSpacer);
label_3 = new QLabel(verticalLayoutWidget);
label_3->setObjectName(QStringLiteral("label_3"));
horizontalLayout->addWidget(label_3);
comboBox = new QComboBox(verticalLayoutWidget);
comboBox->setObjectName(QStringLiteral("comboBox"));
horizontalLayout->addWidget(comboBox);
verticalLayout->addLayout(horizontalLayout);
retranslateUi(VideoPlayer);
QMetaObject::connectSlotsByName(VideoPlayer);
} // setupUi
void retranslateUi(QWidget *VideoPlayer)
{
VideoPlayer->setWindowTitle(QApplication::translate("VideoPlayer", "VideoPlayer", 0));
pushButton->setText(QApplication::translate("VideoPlayer", "play", 0));
pushButton_2->setText(QApplication::translate("VideoPlayer", "stop", 0));
label->setText(QApplication::translate("VideoPlayer", "00:00:00", 0));
label_2->setText(QApplication::translate("VideoPlayer", "/ 00:00:00", 0));
label_3->setText(QApplication::translate("VideoPlayer", "\346\222\255\346\224\276\351\200\237\345\272\246", 0));
comboBox->clear();
comboBox->insertItems(0, QStringList()
<< QApplication::translate("VideoPlayer", "1", 0)
<< QApplication::translate("VideoPlayer", "2", 0)
<< QApplication::translate("VideoPlayer", "3", 0)
<< QApplication::translate("VideoPlayer", "4", 0)
);
} // retranslateUi
};
namespace Ui {
class VideoPlayer: public Ui_VideoPlayer {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_VIDEOPLAYER_H
videoplayer.h
#ifndef VIDEOPLAYER_H
#define VIDEOPLAYER_H
#include <QWidget>
#include <QTimer>
#include <QMessageBox>
#include <cv.h>
#include <highgui.h>
namespace Ui {
class VideoPlayer;
}
class VideoPlayer : public QWidget
{
Q_OBJECT
public:
explicit VideoPlayer(QWidget *parent = 0);
~VideoPlayer();
private:
Ui::VideoPlayer *ui;
private:
QString _file_name;
QTimer *_timer;
CvCapture *_capture;
IplImage *_iplImg;
IplImage *_frame;
QImage *_qImg;
bool _flag; //标志视频播放或暂停
int _Position; //视频帧位置
int _totalFrames;//视频所有帧数
public:
void Open_File(QString filename);
void paintEvent(QPaintEvent *);
public slots:
void nextFrame();
void CallBackTrackBarSlide(int i);
void playStart();
void playStop();
void play_speed_change(const QString &);
};
#endif // VIDEOPLAYER_H
videoplayer.cpp
#include "videoplayer.h"
#include "ui_videoplayer.h"
#include <QPainter>
#include <qdebug.h>
VideoPlayer::VideoPlayer(QWidget *parent) : QWidget(parent),ui(new Ui::VideoPlayer)
{
ui->setupUi(this);
this->setFixedSize(640,560);//这里将窗口固定,只能适合显示640*480大小的视频,如有其他需要,得改进
_Position=0;
_flag=false;
_timer = new QTimer(this);
_timer->setInterval(66);
Open_File({"C://Users/xxx/Videos/6fish.AVI"});//这里可以扩展成打开指定的文件
connect(_timer,&QTimer::timeout,this,&VideoPlayer::nextFrame);
connect(ui->pushButton,&QPushButton::clicked,this,&VideoPlayer::playStart);
connect(ui->pushButton_2,&QPushButton::clicked,this,&VideoPlayer::playStop);
connect(ui->comboBox, &QComboBox::currentTextChanged,this,&VideoPlayer::play_speed_change);
}
VideoPlayer::~VideoPlayer()
{
delete ui;
}
void VideoPlayer::paintEvent(QPaintEvent *){
QPainter painter(this);
painter.drawImage(QPoint(0,0),*_qImg);
}
void VideoPlayer::Open_File(QString filename){
_file_name=filename;
char* ch;
QByteArray ba = _file_name.toLatin1();
ch = ba.data();
this->setWindowTitle(_file_name);
_capture = cvCaptureFromFile(ch);
if(_capture){
_totalFrames = (int)cvGetCaptureProperty(_capture,CV_CAP_PROP_FRAME_COUNT);
ui->horizontalSlider->setRange(0,_totalFrames);
//时间不知道如何处理,用痕原始的方式
int sec=_totalFrames/15;
int min=sec/60;sec=sec%60;
int h=min/60;min=min%60;
if(sec<10&&min<10){
ui->label_2->setText(tr("/ %0:0%1:0%2").arg(h).arg(min).arg(sec));
}
else if(sec<10){
ui->label_2->setText(tr("/ %0:%1:0%2").arg(h).arg(min).arg(sec));
}
else if(min<10){
ui->label_2->setText(tr("/ %0:0%1:%2").arg(h).arg(min).arg(sec));
}
else{
ui->label_2->setText(tr("/ %0:%1:%2").arg(h).arg(min).arg(sec));
}
_frame = cvQueryFrame(_capture);
_qImg = new QImage(QSize(_frame->width,_frame->height), QImage::Format_RGB888);
_iplImg = cvCreateImageHeader(cvSize(_frame->width,_frame->height), 8,3);
_iplImg->imageData = (char*)_qImg->bits();
connect(ui->horizontalSlider, &QSlider::valueChanged,this, &VideoPlayer::CallBackTrackBarSlide);
_timer->start();
_flag=true;
}
}
void VideoPlayer::nextFrame(){
_frame = cvQueryFrame(_capture);
if(_frame){
cvCopy(_frame,_iplImg,0);
cvCvtColor(_iplImg,_iplImg,CV_BGR2RGB);
this->update();
_Position++;
if(_Position%15 == 0)
{
ui->horizontalSlider->setValue(_Position);
}
}
else{ //video end
_timer->stop();
QMessageBox::information(this, tr("提示"), tr("视频结束!"));
exit(1);
}
}
void VideoPlayer::CallBackTrackBarSlide(int i){
cvSetCaptureProperty(_capture,CV_CAP_PROP_POS_FRAMES,i);
_Position =i;
//时间不知道如何处理,用痕原始的方式
int sec=_Position/15;
int min=sec/60;sec=sec%60;
int h=min/60;min=min%60;
if(sec<10&&min<10){
ui->label->setText(tr("%0:0%1:0%2").arg(h).arg(min).arg(sec));
}
else if(sec<10){
ui->label->setText(tr("%0:%1:0%2").arg(h).arg(min).arg(sec));
}
else if(min<10){
ui->label->setText(tr("%0:0%1:%2").arg(h).arg(min).arg(sec));
}
else{
ui->label->setText(tr("%0:%1:%2").arg(h).arg(min).arg(sec));
}
}
void VideoPlayer::playStart(){
_timer->start();
_flag=true;
}
void VideoPlayer::playStop(){
_timer->stop();
_flag=false;
}
void VideoPlayer::play_speed_change(const QString &){
int play_speed=ui->comboBox->currentText().toInt();
if(_flag){
_timer->stop();
_timer->start(66/play_speed);
}
else{
_timer->start(66/play_speed);
_timer->stop();
}
}
简易视频播放器2 (基于Qt、opencv)的更多相关文章
- C语言基于GTK+Libvlc实现的简易视频播放器
小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文.简易 ...
- C语言基于GTK+Libvlc实现的简易视频播放器(二)
简易视频播放器-全屏播放 一.课程说明 上一次我们使用gtk+libvlc实现了一个最简单的视频播放器,可以实现点击按钮暂定和停止播放视频,以及同步显 示视频播放进度,但即使作为一个视频播放器,只有这 ...
- 【Harmony OS】【ArkUI】ets开发 简易视频播放器
前言:这一次我们来使用ets的Swiper组件.List组件和Video组件制作一个简易的视频播放器.本篇是以HarmonyOS官网的codelab简易视频播放器(eTS)为基础进行编写.本篇最主要 ...
- C#简易播放器(基于开源VLC)
可见光通信技术(Visible Light Communication,VLC)是指利用可见光波段的光作为信息载体,不使用光纤等有线信道的传输介质,而在空气中直接传输光信号的通信方式.LED可见光通信 ...
- FFmpeg简易播放器的实现-视频播放
本文为作者原创:https://www.cnblogs.com/leisure_chn/p/10047035.html,转载请注明出处 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- FFmpeg简易播放器的实现-音视频播放
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10235926.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
- 转:最简单的基于 DirectShow 的视频播放器
50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...
- 最简单的基于DirectShow的示例:视频播放器图形界面版
===================================================== 最简单的基于DirectShow的示例文章列表: 最简单的基于DirectShow的示例:视 ...
- FFmpeg简易播放器的实现-音视频同步
本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10284653.html 基于FFmpeg和SDL实现的简易视频播放器,主要分为读取视频文 ...
随机推荐
- 飘逸的python - 一个最简单的服务器
python拥有这种单独起一个服务器监听端口的能力,用标准库的wsgiref就行. from wsgiref.simple_server import make_server def simple_a ...
- C#语言基础之运算符
运算符分类.优先级 运算符:一.数学运算符:+,-,*,/,++,-- 示例1: 示例2: 示例3: 1.递增运算符:++(1)前缀递增运算符 int x=4; x++;//输出结果,x的 ...
- Django forms 关于select和checkbox设置初始选中值及让前端选中指定值
Django的forms和models一样很牛逼.他有两种功能,一是生成form表单,还有就是form表单的验证. 这里主要说一下生成form表单时经常用到的需要设置 初始值 / 默认值 的情况. 1 ...
- JS实现常用的分享到按钮
我们阅读博客的时候经常会用到这样功能,当然有时候也会想把自己的网站上也加入类似的分享功能,各大厂商已经给出了相应的API,点击一个按钮即可弹出窗口进入分享,我们事先可以设置一些参数,一般常用的就是 网 ...
- Windows Phone 8本地化多语言支持
原文 Windows Phone 8本地化多语言支持 在WP8平台处理本地化多语言的支持还是比较容易的,大部分工作都有VS IDE处理,开发者只需简单操作,并翻译本地资源即可实现. 无论您目前的应用是 ...
- BZOJ 1631: [Usaco2007 Feb]Cow Party
题目 1631: [Usaco2007 Feb]Cow Party Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 491 Solved: 362[Sub ...
- 质因数分解的rho以及miller-rabin
一.前言 质因数分解,是一个在算法竞赛里老生常谈的经典问题.我们在解决许多问题的时候需要用到质因数分解来辅助运算,而且质因数分解牵扯到许许多多经典高效的算法,例如miller-rabin判断素数算法, ...
- Codeforces Round #198 (Div. 2) B. Maximal Area Quadrilateral
B. Maximal Area Quadrilateral time limit per test 1 second memory limit per test 256 megabytes input ...
- 周根项《一分钟速算》全集播放&下载地址
点击图片就可以观看 ↓↓↓↓↓↓↓↓ 第1章:指算法 周根项<一分钟速算>第1章:指算法 第一节 对手的认识 周根项<一分钟速算>第1章:指算法 第二节 个位数比十位数大1乘以 ...
- BitNami一键安装Redmine
1. 简单介绍 对于一个新手,假设严格依照官方文档来安装redmine,我想会"疯"掉的.有没有一种简便的方法.有滴,那就是BitNami. BitNami提供redmine的一键 ...