opencv
提供了簡(jiǎn)單而高效的方法,通過(guò)調(diào)用回調(diào)函數(shù),以實(shí)現(xiàn)對(duì)視頻播放的簡(jiǎn)單控制,包括進(jìn)度條拖動(dòng)和暫停播放控制。
此函數(shù)通過(guò)創(chuàng)建一個(gè)指定范圍的控制條(一個(gè)范圍控制或者滑動(dòng)條)劫流,通過(guò)回調(diào)函數(shù)同步一個(gè)表示滑動(dòng)條位置的變量值巫玻。該函數(shù)的簡(jiǎn)單介紹和參數(shù)說(shuō)明如下:
void createTrackbar(const String& trackbarname, // 控制條的名稱(chēng)
const String& winname, //窗口名稱(chēng),用以顯示進(jìn)度條
int * value, //整數(shù)指針祠汇,表示控制條當(dāng)前所處的位置(一般調(diào)用中仍秤,傳int變量地引用)
int count, //控制條的最大值,最小的位置總是0
onChange, //回調(diào)函數(shù)的指針可很,反映每一時(shí)刻控制條的位置诗力,函數(shù)原型是 void Foo(int,void*), 第一個(gè)參數(shù)表示控制條的位置,第二個(gè)參數(shù)表示用戶(hù)數(shù)據(jù)
userdata // 回調(diào)函數(shù)傳遞的用戶(hù)數(shù)據(jù)我抠,可以通過(guò)非全局變量實(shí)現(xiàn)控制條事件控制
)
通過(guò)以上函數(shù)苇本,可以實(shí)現(xiàn)視頻播放和暫停控制的代碼如下:
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
int FrameNums; //視頻幀的數(shù)量
int trackValue = 0; // 控制條數(shù)值
int paused = 0; // 是否暫停
int framePos = 0;
void onChange(int,void* param) // 控制進(jìn)度條位置的回調(diào)函數(shù)
{
VideoCapture cap = *(VideoCapture*)param;
cap.set(CAP_PROP_POS_FRAMES,trackValue);
}
void controlPause(int,void *) // 控制播放暫停的回調(diào)函數(shù)
{
if (paused == 0)
{
paused = 1;
}
else
{
paused = 0;
}
}
int main()
{
VideoCapture cap = VideoCapture("stellaris.mp4");
if (!cap.isOpened())
{
std::cerr << "視頻打開(kāi)錯(cuò)誤菜拓!" << std::endl;
exit(0);
}
FrameNums = cap.get(CAP_PROP_FRAME_COUNT); //視頻總幀數(shù)
double fps = cap.get(CAP_PROP_FPS); //視頻幀率
namedWindow("video", 1);
createTrackbar("trackbarslide","video",&trackValue,FrameNums,onChange,&cap); //視頻進(jìn)度條控制
createTrackbar("pause", "video", &trackValue, 1, controlPause); //視頻播放暫桶暾控制
Mat frame; //視頻幀
while (1)
{
if(paused==0) //播放
{
framePos = cap.get(CAP_PROP_POS_FRAMES);
setTrackbarPos("trackbarslide", "video", framePos);
cap >> frame;
if (frame.empty())
{
break;
}
imshow("video", frame);
waitKey(3);
framePos++;
}
else //暫停
{
imshow("video", frame);
}
char c = waitKey(3);
if (c == 27) break;
}
cap.release();
destroyWindow("video");
return 0;
}
實(shí)現(xiàn)效果如下: