程序功能:播放视频和能通过进度条控制视频的播放
程序:
<span style="font-weight: normal;">// learn_playAVI2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<cv.h>
#include<opencv\highgui.h>
using namespace std;
int g_position = 0;
CvCapture* g_capture = NULL;
void onTrackbarSlide(int pos) {//定义回调函数,改变下一步要播放的位置
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
}
int main() {
cvNamedWindow( "视频播放器", CV_WINDOW_AUTOSIZE );
g_capture = cvCreateFileCapture("D:\\mm.mp4");
int frames = (int) cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
cvCreateTrackbar(
"Position",
"视频播放器",
&g_position,
frames,
onTrackbarSlide
);
IplImage* frame;
frames = 0;
while(1) {
frame = cvQueryFrame( g_capture );
if( !frame ) break;//视频播放完时退出循环体
frames = (int)cvGetCaptureProperty( g_capture, CV_CAP_PROP_POS_FRAMES);
printf("\nFrame number=%d\n",frames);
cvSetTrackbarPos("Position","视频播放器",frames);//改变滑块位置
cvShowImage( "视频播放器", frame);//显示图像
char c = (char)cvWaitKey(10);
if( c == 27 ) break;//用户触发ESC按键后退出循环体
}
cvReleaseCapture( &g_capture );
cvDestroyAllWindows();//关闭所有窗口,同时释放所有为窗口分配的内存。
return(0);
}</span>
程序运行结果:
程序分析:
使用OpenCV播放视屏,跟显示图像差不多,播放视频时要解决的问题就是如何循环地读取视频的一帧一帧的画面。cvCreateFileCapture()函数的功能是通过参数设置确定要读入视频文件,之后返回一个指向CvCapture结构的指针,CvCapture结构里包含了视频文件信息。cvGetCaptureProperty的作用是从CvCapture结构查询数据,当第二个参数为CV_CAP_PROP_FRAME_COUNT时可获取到视频文件中帧的总数,而当参数设置为CV_CAP_PROP_POS_FRAMES时可获取到将被下一步解压的帧索引,以0为起点。cvCreateTrackbar()函数的作用是创建滚动条,第三个参数是设定滑块位置的最大值,第四个指定当trackbar位置被改变的时候调用的回调函数。cvQueryFrame()函数的功能就是从摄像头或视频文件中获取一帧回来。