利用openCV的函数实现进度条以帧为单位来控制视频播放,进度条的滑块可随视频播放而自动滑动。
代码参考自《openCV学习》
#include <opencv2\highgui.hpp>
using namespace cv;
int g_slider_position = 0;
CvCapture* g_capture = NULL;
//回调函数,实现窗口滚动条
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty( //设置视频获取属性
g_capture, //视频获取结构
CV_CAP_PROP_POS_FRAMES, //单位为帧数的位置(只对视频文件有效)
pos //
);
}
void video_test01()
{
cvNamedWindow("video_test01", CV_WINDOW_AUTOSIZE); //创建窗口,窗口大小随着视频画面大小而变化
g_capture = cvCreateFileCapture("D:\\picture\\airplane.flv"); //获得视频结构体
int frames = cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT); //获取视频流的各种属性,CV_CAP_PROP_FRAME_COUNT获取视频文件中总的帧数
if (frames != 0)
{
cvCreateTrackbar(
"Position", //创建滚动条的名字
"video_test01", //窗口名字,滚动条所在窗口的名字
&g_slider_position, //g_slider_position其值反应了滑块的位置,此时是滚动条创建时滑块的位置
frames, //滑块位置的最大值,最小值为0,可以理解为视频的总的帧数
onTrackbarSlide //每次滑块位置发生变化时,就会调用回调函数
);
}
IplImage* frame; //图像结构体
//while loop capture & show video
while (1)
{
frame = cvQueryFrame(g_capture); //从视频文件中抓取一帧,并返回一帧
if (!frame)
break; //如果视频文件抓取结束,跳出循环
cvShowImage("video_test01", frame);
cvSetTrackbarPos("Position", "video_test01", g_slider_position); //设置trackbar显示的位置
onTrackbarSlide(g_slider_position++); //可以实现滑块随着视频的播放而滚动
char c = cvWaitKey(33);
if (c == 27)
break;
}
//Release memory and destory window
cvReleaseCapture(&g_capture);
cvDestroyWindow("video_test01");
}
int main(int argc, char** argv)
{
video_test01();
return 0;
}
效果图
注
虽然实现了进度条滑块随着视频的播放而移动,但是视频播放并不流畅,有待解决!