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;
}
找了半天,一直没办法解决,后来终于发现是这么回事。
方法一:(这办法很笨,而且很不建议这样做,因为处理结果的视频大小会让你震惊!)
下载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中avi视频的读取问题,以及内部格式要求
- 关于opencv中不能读取视频avi的问题
- AVI编码方式及OpenCV读取AVI文件-解决opencv无法读AVI视频的问题
- AVI编码方式及OpenCV读取AVI文件-解决opencv无法读AVI视频的问题
- OpenCV读取MP4视频裁剪部分后写成AVI视频
- 关于Linux下使用OpenCv读取视频打不开的问题
- python + opencv: 解决不能读取视频的问题
- opencv读取视频的程序,releae下静态编译,在没有安装opencv的电脑上需要一个解码dll
- opencv播放不了AVI视频的问题
- Opencv读取视频文件的几个问题及解决方法(读入空Mat,访问冲突)
- DivX/XviD -opencv 视频文件读取显示问题解决
- 利用OpenCv读取视频时释放IplImage结构的问题
- 解决opencv无法读AVI视频的问题
- 用OpenCV的VideoCapture类读取avi视频文件,并以帧流的形式显示出来!
- OpenCV在多线程下不能读取AVI视频的解决办法(转)
- OPENCV读取AVI视频失败 视频帧提取以及图片合成视频
- OpenCV在多线程下不能读取AVI视频新的解决办法cvCaptureFromFile
- linux 正确安装opencv解决无法读取视频的问题
- 初学opencv读取视频的小问题-解决
- matlab读取avi视频问题总结(结合别人的解决方法)