题目说明:创建一个程序读入和显示视频文件,并可以使用滑动条控制视频文件的播放。一个滑动条用来控制视频播放位置,以10为步长跳进。另一个滑动条用来控制停止/播放。
#include <highgui.h>
#include <cv.h>
int g_slider_position = 0;
CvCapture* g_capture = NULL;
int i = 0;
int g_slider_position1 = 0;
bool t = true;
//回调函数1
void onTrackbarSlide(int pos)
{
if(pos%10 != 0)
{
pos = pos - pos%10 ;//调整滚动条开始处均以10为单位
}
cvSetCaptureProperty ( g_capture, CV_CAP_PROP_POS_FRAMES, pos );
i = pos;
}
//回调函数2
void switch_callback(int position)
{
if(position == 0)
{
t = true;//使滚动条以10帧为步距进行播放
}
else
{
t = false;//使滚动条一致播放当前帧
}
}
int main()
{
cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);
g_capture = cvCaptureFromFile("E:/song.mp4");
int frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_FRAME_COUNT );
if(frames != 0)
{
//控制视频播放的滑动条
cvCreateTrackbar( "播放进度条", "Video", &g_slider_position, frames, onTrackbarSlide);
//控制视频停止播放的滑动条
cvCreateTrackbar( "播放停止条", "Video", &g_slider_position1, 1, switch_callback);
}
cvSetTrackbarPos("播放进度条", "Video", 1 );
cvSetTrackbarPos("播放停止条", "Video", 0 );
IplImage * frame;
while( (frame= cvQueryFrame(g_capture)) != NULL)
{
//计算机获取视频需要一定时间,时间未知
char c = cvWaitKey(50);
if(c == 27) break;
cvShowImage("Video", frame);
//设置滚动条移动步距
cvSetTrackbarPos("播放进度条", "Video", i);
if(t)
{
i = i+ 10; // 10为步长
cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, i );
}
else
{
cvSetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES, i );
}
}
cvReleaseCapture(&g_capture);
//cvReleaseImage(&frame);
/*没有必要通过cvReleaseImage()对这个返回的图像指针进行释放,当
CvCapture结构被释放后,每一帧图像所对应的内存空间即会被释放*/
cvDestroyWindow("Video");
return 0;
}
运行结果:
引用:qdsclove的专栏
http://blog.csdn.net/stk_overflow/article/details/8760110