利用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;
}
效果圖
注
雖然實現了進度條滑塊隨着視頻的播放而移動,但是視頻播放並不流暢,有待解決!