3控制视频的进度
本例是实现类似播放器的功能。可以通过进度条来播放视频的进度、或某一位置。
思路:
1.要读取视频。cvCreateFileCapture(),建议使用绝对路径。
2.要获取视频的总帧数,这样才可以更好地设置进度条的范围。。cvGetCaptureProperty()
第二个参数与获取摄像头的函数一样。如下:
3.创建进度条cvCreateTrackbar()
参数如下:
注意:该函数的最后一个参数是回调函数。
可以在回调函数中再次设置视频获取属性 cvSetCaptureProperty()。比如滑块随意移动了,帧数也要跟上。
cvSetCaptureProperty()
第三个参数,记录着滑块的时刻位置。
因此,当滑块任意移动后,要将此参数赋值给cvSetTrackbarPos()中的设置滑块的位置。才可以做到,移动后,帧数跟上、滑块位置跟上。
4.播放视频,同时滚动条也要随帧数移动。
播放视频:
frames=cvQueryFrame(g_Capture);
cvShowImage("Show",frames);
设置滚动条的位置:
cvSetTrackbarPos("Position","Show",g_nFrameCount++);
源代码: // CtrlVideoLen(opencv).cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include "cv.h" #include "opencv2/highgui/highgui.hpp" using namespace std; CvCapture* g_Capture=NULL; int g_nSliderPos=0; //记录滑块的位置 int g_nFrameCount=0; //视频的总帧数 int frame=0; //某时刻视频的帧数 void OnTrackbarSlider(int pos) { //设置视频获取属性 cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos); g_nFrameCount=pos; } int _tmain(int argc, _TCHAR* argv[]) { cvNamedWindow("Show"); //打开视频 g_Capture=cvCreateFileCapture("C:/Users/Public/Videos/Sample Videos/我们在一起的时光.mp4"); //获取视频的中帧数 frame=(int)cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT); //创建滚动条 if(frame>0) { cvCreateTrackbar("Position","Show",&g_nSliderPos,frame,OnTrackbarSlider); } IplImage *frames; //存放视频的帧片图 //播放视频 while(1) { frames=cvQueryFrame(g_Capture); if(!frames) { break; } cvShowImage("Show",frames); cvWaitKey(1); //不断更新滑块位置 cvSetTrackbarPos("Position","Show",g_nFrameCount++); } //释放内存 cvReleaseCapture(&g_Capture); cvDestroyWindow("Show"); system("pause"); return 0; }