OpenCV 播放mkv视频

作者:卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/33371013

一、一个简单的OpenCV程序,用于播放硬盘中的视频文件

#include "opencv\highgui.h"  

int main()
{
	cvNamedWindow("生活大爆炸.mkv",CV_WINDOW_AUTOSIZE);
	CvCapture* capture = cvCreateFileCapture("生活大爆炸.mkv");
	IplImage* frame = NULL;
	while (1)
	{
		frame = cvQueryFrame(capture);
		if (!frame)
			break;
		cvShowImage("生活大爆炸.mkv",frame);
		char c = cvWaitKey(33);
		if (c == 27)
			break;
	}
	cvReleaseCapture(&capture);
	cvDestroyWindow("生活大爆炸.mkv");
    return 0;
}  

二、播放效果

使用OpenCV播放视频,几乎与使用它来显示图像一样容易。播放视频时只需要处理的新问题就是如何循环地顺序读取视频中的每一帧,以及如何从枯燥的电影视频的读取中退出该循环操作。

三、源代码分析

cvNamedWindow("生活大爆炸.mkv",CV_WINDOW_AUTOSIZE);

::新建一个标题为 “生活大爆炸.mkv” ,CV_WINDOW_AUTOSIZE 表示窗体自适应大小。

CvCapture* capture = cvCreateFileCapture("生活大爆炸.mkv");

::函数cvCreateFileCapture()通过参数设置确定要读入的mkv文件,返回一个指向CvCapture结构体的指针。这个结构体包括了所有关于读入mkv文件的信息,其中包含状态信息。在调用这个函数后,返回指针所指向的CvCapture结构体被初始化到所对应的mkv文件的开头。

frame = cvQueryFrame(capture);

::一旦进入while(1)循环,我们便开始读入mkv文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存(实际是填充或更新CvCapture结构中)。返回一个对应当前帧的指针。与cvLoadImage不同的是,cvLoadImage为图像分配内存空间,而cvQueryFrame使用已经在cvCapture结构中分配好的内存。这样的话,就没必要通过cvReleaseImage()对这个返回的图像指针进行释放,当CvCapture结构被释放后,每一帧图像所对应的内存空间即被释放。

char c = cvWaitKey(33);

if (c == 27)

break;

::表示当用户按ESC键时,退出视频播放。

四、实现滚动条&并使滚动条随着播放移动

#include "opencv\highgui.h"
#include "opencv\cv.h"

int g_pos = 0;
CvCapture *g_capture = NULL; 

//回调函数
void onTrackbarSlide(int pos)
{
	cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);
}
int main()
{
	cvNamedWindow("生活大爆炸.mkv",CV_WINDOW_AUTOSIZE); //创建窗体
	g_capture = cvCreateFileCapture("生活大爆炸.mkv");  //获得要载入的mkv文件

	int frames = (int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); //获得mkv文件总帧数
	if (frames != 0) //mpeg编码格式的文件不可后退拖动
	{
		cvCreateTrackbar("当前位置","生活大爆炸.mkv",&g_pos,frames,onTrackbarSlide);
	}
	IplImage* frame = NULL;

	while (1)
	{
		//获得下一帧
		frame = cvQueryFrame(g_capture);
		if (!frame)
			break;
		cvShowImage("生活大爆炸.mkv",frame);

		//获取视频播放位置
		int nowpos=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES);
		//设置进度条位置,使其和视频播放同步
		cvSetTrackbarPos("当前位置","生活大爆炸.mkv", nowpos);
		//ESC退出
		char c = cvWaitKey(33);
		if (c == 27)
			break;
	}
	cvReleaseCapture(&g_capture);
	cvDestroyWindow("生活大爆炸.mkv");
    return 0;
}  

五、滚动条效果

不过,貌似有点卡的样子。可能主要是帧数的问题吧,暂停33ms的问题。

参考文献:(美)布拉德斯基(Bradski,G.),(美)克勒(Kaehler,A.) 著,于仕琪,刘瑞祯 译.学习OpenCV(中文版)[M].北京:清华大学出版社,2009.21-26.

lisa的新浪博客.OpenCV笔记3 视频读取与进度条[CP/OL].http://blog.sina.com.cn/s/blog_67e477780100mpg9.html,2010-11-26/2014-06-23.

Augusdi的专栏.OpenCV播放视频并控制位置[CP/OL].http://blog.csdn.net/augusdi/article/details/9000592,2013-05-31/2014-06-23.

OpenCV 播放mkv视频

时间: 2024-10-24 12:00:50

OpenCV 播放mkv视频的相关文章

OpenCV 入门示例之二:播放 AVI 视频

前言 本文展示一个播放 AVI 视频的程序.( 呵呵是 AVI 视频不是 AV 视频噢! ) 代码示例 OpenCV 入门示例之二:播放 AVI 视频,布布扣,bubuko.com

opencv播放,变换和保存视频

核心函数: 1. cvCreateFileCapture 2. cvGetCaptureProperty 3. cvQueryFrame 4. cvCreateVideoWriter 5. cvWriteFrame 程序: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> #include <stdio.h> int V

OpenCV视频读取播放,视频转换为图片

转载请注明出处!!! http://blog.csdn.net/zhonghuan1992 OpenCV视频读取播放,视频转换为图片 介绍几个有关视频读取的函数: VideoCapture::VideoCapture VideoCapture能够从文件里或者摄像头中读取视频,这是提供给C++的接口的.C的接口是CvCapture结构.        <span style="white-space:pre"> </span>C++: VideoCapture::

手机影音第十一天,显示视频缓冲,显示卡顿时的网速,播放系统视频时调用播放器的选择

代码已经托管到码云,有兴趣的小伙伴可以下载看看 https://git.oschina.net/joy_yuan/MobilePlayer 一.设置视频缓冲进度 显示视频播放进度的效果图如下:灰色的是缓冲的进度. 原理:只有播放网络视频时,才有缓冲这个说法,所以要先判断视频资源是否为网络资源 /**  * 判断是否是网络的资源  * @param uri  * @return  */ public boolean isNetUri(String uri) {     boolean reault

Raspbian PIXEL不能播放flash视频的解决办法

Raspbian PIXEL虽然已经自带chromium浏览器,而且也安装了Pepper Flash Player插件,但默认还是不能播放flash视频的,需要执行下面两个命令之后才能真正解决这个问题. sudo apt-get update sudo apt-get dist-upgrade PS:执行上面的命令之前,最好把软件源改一下,要不然估计要很长时间才能执行完.

html5播放mp4视频代码

1.nginx支持flv和mp4格式播放 默认yum安装nginx centos7安装nginx时候应该是默认安装nginx_mod_h264_streaming模块的 # nginx -V查看是否安装nginx_mod_h264_streaming模块 nginx在新版本中已经支持了--with-http_mp4_module --with-http_flv_module这2个模块即可 # vi /etc/nginx/nginx.conf server { listen       80 de

android webview 通过html5播放在线视频 切换大屏

1.添加网络访问权限 <uses-permission android:name="android.permission.INTERNET" /> 2.webview添加全屏支持 developer官方文档关于html5支持视频播放描述如下:In order to support inline HTML5 video in your application, you need to have hardware acceleration turned on, and set

VLC播放RTSP视频延迟问题

VLC播放RTSP视频延迟问题 配置 VLC 以播放 RTSP/RTP 流 vlc播放rtp封装的h.264延时很大是什么原因? 开启打印: VLC的工具->消息->等级 调整为2,就可以看到VLC的错误调试信息.

Android[安德鲁斯] 文本Air Video 远程播放电脑视频

苹果iOS下列.目前应用Air Video,能力iOS由Wifi远程直接播放电脑视频,无需看视频复制到手机.非常好用!最近使用Android打电话.展望类别似应用,找了很长一段时间没有找到.在仔细的思考AirVideo工程,视频站点类似,在Android以下应该也能够有类似的方法实现. 今日在华为荣耀6上面最终验证通过了一个完美的方案.赶紧放上来和有相同须要的朋友们分享分享. 先说一下Air Video的工作原理: 1) 在Windows以下安装Air Video Serverserver,并设