opencv 实现视频暂停播放和进度条控制

2021-03-28  本文已影响0人  此间不留白

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;

}

实现效果如下:


上一篇 下一篇

猜你喜欢

热点阅读