美文网首页
opencv 实现视频暂停播放和进度条控制

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

作者: 此间不留白 | 来源:发表于2021-03-28 12:01 被阅读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;

}

实现效果如下:


相关文章

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

    opencv提供了简单而高效的方法,通过调用回调函数,以实现对视频播放的简单控制,包括进度条拖动和暂停播放控制。此...

  • AVPlayer封装

    说明 基于AVPlayer和MVP模式封装的一个视频播放控制器,支持全屏,暂停播放,进度条拖动。 Demo地址 A...

  • 小程序音乐播放器

    一、实现效果 点击播放按钮歌曲进行播放,点击暂停停止播放 显示歌曲当前播放时间和总时间 随着歌曲播放进度条变红,点...

  • Unity VideoPlayer

    VideoPlayer控制脚本,使用videoplayer组件控制视频频播放 Slider控制脚本,使用进度条控制...

  • 抖音视频切换和进度条同步视频

    Vue 实现视频在竖直方向的切换,切换时播放视频;实现拖动进度条同步视频进度;