要播放视频其实和显示图像一样简单,只要考虑播放视频的时候如何循环地顺序读取视频中的每一帧,并且怎么退出该循环。
由一般看视频经验知道,当我们按ESC(ASCII=27)键就可以退出播放。
另外就是加入控制条,控制视频播放进度。可以考虑记录该段视频的总帧数,然后跳到指定帧的位置,继续读取下一帧。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int g_slider_position = 0;//滑块的位置
CvCapture *g_capture = NULL;//用g_来定义全局变量,程序可读性更强一些
/*回调函数,使其在滚动条被拖动时调用。
滚动条的位置pos以一个32位整数的形式传进来。
用来更新变量以及重新设置视频读入位置。*/
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,//此参数表示以帧数来设置读入位置,如果用AVI_RATIO代替FRAMES则以视频长度比例读入
pos);
}
int main(int argc, char **argv)
{
cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);
g_capture = cvCreateFileCapture("D:\\firststep.rmvb");//确定要读入的RMVB文件,返回一个Capture结构的指针
int frames = (int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if (frames != 0){
cvCreateTrackbar( //创建滚动条
"Position", //滚动条的名称
"Example1",//滚动条所属的窗口
&g_slider_position,
frames,
onTrackbarSlide
);
}
IplImage *frame;
while (1)
{
frame = cvQueryFrame(g_capture); /*cvQueryFrame函数用来将下一帧视频文件
载入内存,其实也就是更新CvCapture结构。最后
返回一个对于当前帧的指针*/
if (!frame)break;
cvShowImage("Example1", frame);
char c = cvWaitKey(33);//每一帧显示后等待33ms
if (c==27) break;//如果按键是ESC键(ASCII=27),循环被退出,读入视频停止
}
cvReleaseCapture(&g_capture);
cvDestroyWindow("Example1");
}