zl程序教程

您现在的位置是:首页 >  其他

当前栏目

3控制视频的进度

控制 视频 进度
2023-09-11 14:21:07 时间

本例是实现类似播放器的功能。可以通过进度条来播放视频的进度、或某一位置。

 

思路:

1.要读取视频。cvCreateFileCapture(),建议使用绝对路径。

2.要获取视频的总帧数,这样才可以更好地设置进度条的范围。。cvGetCaptureProperty()

第二个参数与获取摄像头的函数一样。如下:

3.创建进度条cvCreateTrackbar()

参数如下:

注意:该函数的最后一个参数是回调函数。

可以在回调函数中再次设置视频获取属性 cvSetCaptureProperty()。比如滑块随意移动了,帧数也要跟上。

cvSetCaptureProperty()

第三个参数,记录着滑块的时刻位置。

因此,当滑块任意移动后,要将此参数赋值给cvSetTrackbarPos()中的设置滑块的位置。才可以做到,移动后,帧数跟上、滑块位置跟上。

 

4.播放视频,同时滚动条也要随帧数移动。

播放视频:

frames=cvQueryFrame(g_Capture);

cvShowImage("Show",frames);

设置滚动条的位置:

cvSetTrackbarPos("Position","Show",g_nFrameCount++);

 

源代码:        
// CtrlVideoLen(opencv).cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include "cv.h"
#include "opencv2/highgui/highgui.hpp"

using namespace std;

CvCapture* g_Capture=NULL;
int g_nSliderPos=0;        //记录滑块的位置
int g_nFrameCount=0;    //视频的总帧数
int frame=0;            //某时刻视频的帧数

void OnTrackbarSlider(int pos)
{
    //设置视频获取属性
    cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);
    g_nFrameCount=pos;
}

int _tmain(int argc, _TCHAR* argv[])
{
    cvNamedWindow("Show");
    //打开视频
    g_Capture=cvCreateFileCapture("C:/Users/Public/Videos/Sample Videos/我们在一起的时光.mp4");
    //获取视频的中帧数
    frame=(int)cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);
    //创建滚动条
    if(frame>0)
    {
        cvCreateTrackbar("Position","Show",&g_nSliderPos,frame,OnTrackbarSlider);
        
    }
    IplImage *frames;    //存放视频的帧片图
    //播放视频
    while(1)
    {
        frames=cvQueryFrame(g_Capture);
        if(!frames)
        {
            break;
        }
        cvShowImage("Show",frames);
        cvWaitKey(1);
        //不断更新滑块位置
        cvSetTrackbarPos("Position","Show",g_nFrameCount++);
    }
    //释放内存
    cvReleaseCapture(&g_Capture);
    cvDestroyWindow("Show");
    system("pause");
    return 0;
}