视频画面本质上是由一帧一帧的连续图像组成的,播放视频其实就是在播放窗口把一系列连续图像按一定的时间间隔一幅幅贴上去实现的。

人眼在连续图像的刷新最少达到每秒24帧的时候,就分辨不出来图像间的闪动了,使人感觉呈现出来的是连续的画面,视频的播放就是利用了这一点。我们知道,电影被称为“24帧的艺术”,意思就是电影画面每秒刷新24帧,即每秒显示24副图像,它的帧率(Frames per Second,简称:FPS)为24。

一般情况下帧率要大于等于24,以下先测试一下两个视频文件的帧率,一个是网络上下载的“”friends“”,一个是用手机拍摄的视频。

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>using namespace cv;int main(int argc,char *argv[])
{VideoCapture videoFriends(argv[1]);VideoCapture videoPhone(argv[2]);double fpsFriends=videoFriends.get(CV_CAP_PROP_FPS);double fpsPhone=videoFriends.get(CV_CAP_PROP_FPS);std::cout<<"FPS of Friends is: "<<fpsFriends<<std::endl;std::cout<<"FPS of MyPhone is: "<<fpsPhone<<std::endl;system("pause");return 0;
}

经测试,两个视频文件的帧率都是23.976

播放与进度控制里主要用到 VideoCapture类里的get()函数,和创建控制条的createTrackbar()函数,get()函数用于获取视频的帧数、帧率等信息,了解get函数的参数含义即可,像get(CV_CAP_PROP_FRAME_COUNT)用于获取总帧数,get(CV_CAP_PROP_FPS)用于获取帧率等。

控制条作为Opencv中一个重要的用户和图像传参、交互的工具,伴随了整个opencv图像处理的过程,之前有提到过,这里有必要再说一说createTrackbar()这个函数。

函数原型

int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);

该函数作用是在指定图像窗口上创建一个控制条,这个控制条具有指定的参数控制范围,可以通过回调函数,执行对应的操作。

第一个参数:const修饰的string类型的引用trackbarname,表示控制条的名称

第二个参数:const修饰的string类型的引用winname,表示控制条所在的图像窗口的名称

第三个参数:int型的指针value,表示滑块的控制位置,拖动控制条滑块的位置,相应的会改变*value的值

第四个参数:int型的count,表示控制条上滑块的最大位置处对应的值

第五个参数:TrackbarCallback类型的onChange,表示一个指向回调函数的指针,每当滑块的位置发生变化,都会触发该回调函数

第六个参数:void型的userdata,一般使用其默认值0

Opencv通过VideoCapture类播放视频与通过createTrackbar创建进度条控制视频播放Code:

#include "core/core.hpp"
#include "highgui/highgui.hpp"
#include "imgproc/imgproc.hpp"
#include <iostream>using namespace cv;Mat image;   //读入视频帧的Mat
char* windowName="Video Control"; //播放窗口名称
char* trackBarName="播放进度";    //trackbar控制条名称
double totalFrame=1.0;     //视频总帧数
double currentFrame=1.0;    //当前播放帧
int trackbarValue=1;    //trackbar控制量
int trackbarMax=255;   //trackbar控制条最大值
double frameRate=1.0;  //视频帧率
VideoCapture video;    //声明视频对象
double controlRate=0.1;//控制条回调函数
void TrackBarFunc(int ,void(*));
int main(int argc,char *argv[])
{//打开视频文件video.open(argv[1]);if(!video.isOpened()){std::cout<<"Failed to open video"<<std::endl;}totalFrame=video.get(CV_CAP_PROP_FRAME_COUNT);  //获取总帧数frameRate=video.get(CV_CAP_PROP_FPS);   //获取帧率double pauseTime=1000/frameRate; // 由帧率计算两幅图像间隔时间namedWindow(windowName);//在图像窗口上创建控制条createTrackbar(trackBarName,windowName,&trackbarValue,trackbarMax,TrackBarFunc);TrackBarFunc(0,0);while (true){video.read(image);resize(image,image,Size(500,400)); //调整图像大小,视频在我的显示器上显示不全imshow(windowName,image);  //显示图像waitKey(pauseTime);   //图像间隔controlRate++;    if(controlRate>totalFrame)  //播放完成退出{break;}}video.release();  //释放视频,C++中不写也无碍,可以自动释放waitKey();return 0;
}
void TrackBarFunc(int ,void(*))
{controlRate=(double)trackbarValue/trackbarMax*totalFrame; //trackbar控制条对视频播放进度的控制video.set(CV_CAP_PROP_POS_FRAMES,controlRate);    //设置当前播放帧
}

拖动控制条的滑块,实现播放进度控制:

每次拖动滑块位置发生,就会触发定义的“TrackBarFunc”回调函数,这个函数做了两件事,一是

controlRate=(double)trackbarValue/trackbarMax*totalFrame; //trackbar控制条对视频播放进度的控制

通过滑块的位置确定视频当前应该播放的帧数;二是

video.set(CV_CAP_PROP_POS_FRAMES,controlRate);    //设置当前播放帧

通过set函数,设置当前播放帧。

在while循环里不断累加当前播放帧变量,当当前播放帧大于总的帧数时,表示视频已经播放到结尾,退出播放。

Opencv中视频播放与进度控制相关推荐

  1. Opencv学习_3 (Opencv读取视频 视频进度控制 写视频)

    opencv读取视频: 使用opencv读取视频主要用到这几个函数:cvCreateFileCapture  cvQueryFrame (或cvGrabFrame cvRetrieveFrame)   ...

  2. 【Android FFMPEG 开发】FFMPEG 视频播放进度控制 ( 显示播放进度 | 拖动进度条播放 )

    文章目录 I . FFMPEG 播放进度控制 II . FFMPEG 播放视频 ( 效果展示 ) III . FFMPEG 获取视频时长 IV . FFMPEG 视频播放进度获取 V . FFMPEG ...

  3. 基于Qt、FFMpeg的音视频播放器设计四(视频播放进度控制)

    上面介绍了如何使用opengl绘制视频和Qt的界面设计,也比较简单,现在我们看下如何控制视频播放及进度的控制,内容主要分为以下几个部分 1.创建解码线程控制播放速度 2.通过Qt打开外部视频 3.视频 ...

  4. FFmpeg音视频播放器系列(第三篇:seek实现播放进度控制)

    文章目录 如何实现播放进度控制 av_seek_frame seek操作要点 按视频流seek 按音频流seek 代码实现 上一篇基本实现了音视频的播放同步,简单的按键控制暂停.恢复.退出操作,这一篇 ...

  5. 【基于QMediaPlayer的简易视频播放器】— 3、结合QSlider实现播放进度控制和音量控制

    基于QMediaPlayer的简易视频播放器 1.创建基本布局 2.QMediaPlayer的基本使用 3.结合QSlider实现播放进度控制和音量控制 4.重载QSlider鼠标响应事件,实现单击跳 ...

  6. opencv 实现进度控制

    进度控制: #include <opencv\cv.h> #include <opencv\highgui.h> #include <opencv\cxcore.h> ...

  7. 敏捷项目中的进度控制

     敏捷项目中的进度控制 消除浪费 时间是软件开发过程中最为稀缺并不可替代的资源.其浪费将直接影响项目的进度.而软件开发过程中存在各种各样的浪费.因此,消除浪费是加快进度的一种重要途径. 返工则是软 ...

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

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

  9. ios 播放不了服务器视频文件流,浅析iOS中视频播放的几种方案

    1.AVPlayer (1) 优缺点 优点:可以自定义 UI, 进行控制 缺点:单纯的播放,没有控制 UI(进度,暂停,播放等按钮),而且如果要显示播放界面, 需要借助AVPlayerLayer, 添 ...

最新文章

  1. 原创:(网格化地图之初)高斯大地座标(经度、纬度)→3°投影带平面直角坐标(X、Y)换算...
  2. Python__数据结构与算法——树、二叉树(实现先、中、后序遍历)
  3. fixed在微信下的BUG
  4. solidity事件详解
  5. MVVM教程(2):
  6. linux git 发邮件,gitlab发邮件基于sendmail
  7. edxp显示未安装_智能水表安装使用注意事项
  8. 石、鋏、布~ 最疯狂的打斗场面,莫要错过,iphone手机游戏
  9. country-converter官方文档----机翻人工确认
  10. mysql 的相关操作_MySQL(记录相关操作)
  11. mysql数字加减乘除_mysql加减乘除
  12. C语言LMS双麦克风消噪算法,一种双麦克风语音降噪方法与流程
  13. Linux 创建用户角色并添加ssh登录权限
  14. java开发一般用se,用大白話聊聊JavaSE
  15. git+vimdiff 一次关闭所有文件
  16. 显卡驱动一定要更新吗?怎么更新显卡驱动?
  17. 2023年深圳技能大赛——大鹏新区潮式风味菜烹饪职业技能竞赛
  18. 综合型集团该如何利用数字化转型支撑磅礴多元的服务?
  19. Win7 运行bat批处理文件时怎么隐藏cmd命令提示符窗口
  20. 【论文 CCF C】An Adaptive Box-Normalization Stock Index Trading Strategy Based on Reinforcement Learning

热门文章

  1. SpringBoot系列课程(二)-SpringBoot整合MyBatis
  2. Java 实现扫雷与高胜率低耗时自动扫雷 AI (下)
  3. 论文阅读:MobileNetV2: Inverted Residuals and Linear Bottlenecks(MobileNetV2)
  4. MVC框架运行流程和目录结构
  5. nlp小白教程:word2vec之数据预处理
  6. 微信获取临时素材接口
  7. 计算机在日常办公众的应用论文,计算机及应用基础专业论文.docx
  8. “如果Java受到一两个大型供应商的控制,则可能会遭受挫折”
  9. 第2课计算机的发展教学反思,信息技术课教学反思2
  10. 如何用纯 CSS 创作一只愤怒小鸟中的绿猪