opencv
提供了简单而高效的方法,通过调用回调函数,以实现对视频播放的简单控制,包括进度条拖动和暂停播放控制。
此函数通过创建一个指定范围的控制条(一个范围控制或者滑动条),通过回调函数同步一个表示滑动条位置的变量值。该函数的简单介绍和参数说明如下:
void createTrackbar(const String& trackbarname, // 控制条的名称
const String& winname, //窗口名称,用以显示进度条
int * value, //整数指针,表示控制条当前所处的位置(一般调用中,传int变量地引用)
int count, //控制条的最大值,最小的位置总是0
onChange, //回调函数的指针,反映每一时刻控制条的位置,函数原型是 void Foo(int,void*), 第一个参数表示控制条的位置,第二个参数表示用户数据
userdata // 回调函数传递的用户数据,可以通过非全局变量实现控制条事件控制
)
通过以上函数,可以实现视频播放和暂停控制的代码如下:
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
int FrameNums; //视频帧的数量
int trackValue = 0; // 控制条数值
int paused = 0; // 是否暂停
int framePos = 0;
void onChange(int,void* param) // 控制进度条位置的回调函数
{
VideoCapture cap = *(VideoCapture*)param;
cap.set(CAP_PROP_POS_FRAMES,trackValue);
}
void controlPause(int,void *) // 控制播放暂停的回调函数
{
if (paused == 0)
{
paused = 1;
}
else
{
paused = 0;
}
}
int main()
{
VideoCapture cap = VideoCapture("stellaris.mp4");
if (!cap.isOpened())
{
std::cerr << "视频打开错误!" << std::endl;
exit(0);
}
FrameNums = cap.get(CAP_PROP_FRAME_COUNT); //视频总帧数
double fps = cap.get(CAP_PROP_FPS); //视频帧率
namedWindow("video", 1);
createTrackbar("trackbarslide","video",&trackValue,FrameNums,onChange,&cap); //视频进度条控制
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;
}
实现效果如下:
网友评论