您的位置:首页 > 运维架构

opencv读取avi视频解码问题

2013-08-23 19:14 573 查看
遇到了opencv读取avi视频一闪而过的问题,cvCreateFileCapture函数总返回NULL。

找了半天,一直没办法解决,后来终于发现是这么回事。

方法一:(这办法很笨,而且很不建议这样做,因为处理结果的视频大小会让你震惊!)

          下载VitualDub,网址为http://www.virtualdub.org/download.html
             a. File->Open Video File;(它只能打开Uncompressed类型的avi文件 )
             b. Video->Filters->Add->Convert format; 选择4:2:0 Planar YCbCr (YV12)或者 32-Bit RGB。
             c. Save as AVI. 保存完毕。”

             最后再Import已经转换过的avi,就可以顺利运行了。

方法二:(这办法很容易也相当方便,根据你的AVI格式找到相应的解码器就OK啦!)

                1、Uncompressed格式的AVI文件(或是MPEG1格式的),这个不需要装任何插件就可以播放了。

               2、DIVX格式的AVI,这也是MPEG4的一种,安装最新的DIVX ,就可以播放了,不过缺点是在播放之初会有一个DIVX的标记显示几秒。

                下载地址: http://www.divx.com/

               3、XVID格式的AVI,这也是MPEG4的一种,可以说是从DIVX变种而来的,据说是XVID原作者不满意DIVX商业化收费的行为,而开发的一个全Free的MPEG4编              码核心,安装最新的XVID(1.3.2版)就可以播放。下载地址: http://www.xvid.org/Downloads.15.0.html(这个我已经使用,并且成功了)

               4、ffdshow MPEG-4格式的AVI,现在越来越多的AVI都采用ffdshow MPEG-4来,集成了DIVX与XVID的一种东西(好象还支持WMV与AC3音频),因此如果你装了ffdshow MPEG-4,就可以不用装XVID与DIVX等编码核心了。另外ffdshow MPEG-4也提供丰富的滤镜功能比如增亮,增加锐度等,最新的ffdshow MPEG-4 Video Decoder 2013-06-12。下载地址:http://www.free-codecs.com/FFDShow_download.htm

               5、WMV9格式的AVI,微软自己推出的MPEG4编码标准,使用Windows Media 9.0就可以播放,如果没有的话,也可以下载一个Windows Media Encoder 9.0,使你的系统支持WMV 9.0的格式。下载地址:http://mydown.yesky.com/soft/multimedia/others/387/439387.shtml  

           6、VP6格式的AVI,也是一种MPEG4的编码格式,On2 Technologies开发的编码器,VP6号称在同等码率下,视频质量超过了Windows Media 9、Real 9和H.264。VP6视频编码器目前被中国的EVD所采用。说真的,现在用这个不多。下载地址:http://www.rayfile.com/zh-cn/files/45612dc2-15f9-11de-8cef-0014221b798a/

 

下面是我的测试代码:

IDE:VC++6.0,opencv1.0(XP sp3系统)

#include "stdafx.h"

#include "cv.h"

#include "highgui.h"

#include "cxcore.h"

int main(int argc, char* argv[])

{

 IplImage* frame = NULL;

 CvCapture* capture;

//创建窗口,用于显示视频

 cvNamedWindow("video",1);

 capture = cvCaptureFromFile(argv[1]);

 if(capture){

  for(;;){

// 调用cvGrabFrame, 让底层api解码一帧图像,如果解码失败,就退出循环,成功,

//解码的图像保存在底层api 的缓冲中

   if(!cvGrabFrame(capture))

    break;

// 将解码得到图像信息从缓存中转换成lpllmange 格式放在frame中

   frame = cvRetrieveFrame(capture);

   if(!frame)

    break;

   cvShowImage("video",frame);

   char c = cvWaitKey(33);

   if( c == 27 )

    break;

  }

//frame这个指针切记不能释放,不然会出现这样的错误

//Unknown error code -49 (Deallocation error) in function cvFree_,C:\User\VP\ opencv\cxcore\src\cxalloc.cpp

//cvReleaseImage(&frame);

  cvReleaseCapture(&capture);
 }
 cvDestroyWindow("video");

 return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv vc++ 视频解码