opencv支持多种流行视频格式文件的读取

写入应该是只支持avi,因为其他格式一般都是压缩格式,压缩格式一般都有帧间压缩,也就是不能只写一帧,可以保存为avi后,转码.
以AVI结尾的视频文件有以下几种:
1、非压缩格式的AVI文件(或是MPEG1格式的),这个不需要装任何插件就可以播放了。
2、DIVX格式的AVI,这也是MPEG4的一种,安装最新的DIVX 5.21(目前最新版),就可以播放了,不过缺点是在播放之初会有一个DIVX的标记显示几秒。
下载地址: http://gupin.fangdown.com/soft/138.htm
3、XVID格式的AVI,这也是MPEG4的一种,可以说是从DIVX变种而来的,据说是XVID原作者不满意DIVX商业化收费的行为,而开发的一个全Free的MPEG4编码核心,安装最新的XVID(1.02版)就可以播放。
下载地址: http://gupin.fangdown.com/soft/45.htm
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 20041012。
下载地址:http://gupin.fangdown.com/soft/383.htm
5、WMV9格式的AVI,微软自己推出的MPEG4编码标准,使用Windows Media 9.0就可以播放,如果没有的话,也可以下载一个Windows Media Encoder 9.0,使你的系统支持WMV 9.0的格式。
下载地址:http://www.ogg.cn/Software/view-software-62.html
6、VP6格式的AVI,也是一种MPEG4的编码格式,On2 Technologies开发的编码器,VP6号称在同等码率下,视频质量超过了Windows Media 9、Real 9和H.264。VP6视频编码器目前被中国的EVD所采用。说真的,现在用这个不多。最新版本是VP6 vfw Codec 6.2.6.0。
下载地址:http://www.ogg.cn/Software/view-software-56.html
7、其它格式的AVI,现在看来还有一些如MKV、OGG等格式的视频编码文件也会使用AVI的结尾名。
其实AVI只是一个外壳。里面的东西可不一样的!
问题:为什么我的电脑支持AVI或者能够播出AVI,但为什么使用cvCreateFileCapture函数总返回NULL呢?
答案:尽管是AVI文件,但也可能使用了某种codec,例如:MJPEG Decompressor。需要把它转换OpenCV

支持的AVI文件. OpenCV支持的AVI如下:

Container

FourCC

Name

Description

AVI

'DIB '

RGB(A)

Uncompressed RGB, 24 or 32 bit

AVI

'I420'

RAW I420

Uncompressed YUV, 4:2:0 chroma subsampled

AVI

'IYUV'

【opencv支持多种流行视频格式文件的读取】RAW I420

identical to I420

转换格式解决方法:

解决方法1:下载mencoder.exe, 在window命令行下使用:

mencoder in.avi -ovc raw -vf format=i420 -o out.avi

(注:我测试了这个方法,没有成功,原因不详,希望有朋友们能够详细讨论一下。)

解决方法2:下载VitualDub, 我使用1.9.4版本

a. File->Open Video File;

b. Video->Filters->Add->Convert format; 选择4:2:0 Planar YCbCr (YV12)或者 32-Bit RGB。

c. Save as AVI. 保存完毕。

(注:成功使用。)




(1)cvCreateVideoWriter
创建视频文件写入器

typedef struct CvVideoWriter CvVideoWriter;
CvVideoWriter* cvCreateVideoWriter( const char* filename, int fourcc, double fps, CvSize frame_size,
int is_color=1 );
filename
输出视频文件名。
fourcc
四个字符用来表示压缩帧的codec 例如,CV_FOURCC('P','I','M','1')是MPEG-1 codec, CV_FOURCC
('M','J','P','G')是motion-jpeg codec等。 在Win32下,如果传入参数-1,可以从一个对话框中选择压缩方
法和压缩参数。 其它的编码器代号包括:

CV_FOURCC('P','I','M','1') = MPEG-1

codec CV_FOURCC('M','J','P','G') = motion-jpeg

codec (does not work well) CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2
codec CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3
常见的有1.0、2.0、3.0三种版本,当然是基于MPEG-4技术的,其中3.0并不能用于AVI的编码,只能用于生成支持“视频流”技术的ASF文件
codec CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4

codec CV_FOURCC('U', '2', '6', '3') = H263
H.263适用于局域网,不过一般机器上这种Codec是用来播放的,不能用于编码。H.263的编码速度快,其设计编码延时不超过150ms;码率低,在512 K 乃至 384K 带宽下仍可得到相当满意的图像效果,十分适用于需要双向编解码并传输的场合(如:可视电话)和网络条件不是很好的场合(如:远程监控)。
codec CV_FOURCC('I', '2', '6', '3') = H263I

codec CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
FLV 是FLASH VIDEO的简称,FLV流媒体格式是一种新的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。

若编码器代号为 -1,则运行时会弹出一个编码器选择框.
fps
被创建视频流的帧率。
frame_size
视频流的大小。
is_color
如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。
函数cvCreateVideoWriter创建视频写入器结构。


(2) AVI到BMP
读入avi,提取每一帧,存成BMP
CvCapture* capture = cvCreateFileCapture("filename.avi");
int i;
CString str;
IplImage* frame;
for (i=0; i<30; i++)
{
frame = cvQueryFrame(capture);
str.Format("%d.bmp",i);
cvSaveImage(str,frame);
}
cvReleaseCapture(&capture);
BMP到AVI :依次读入BMP,写入avi

MPEG1:
是目前实时视频压缩的主流,可适用于不同带宽的设备,如CD-ROM、Video-CD、CD-I与M-JPEG技术相比较,在实时压缩、每帧数据量、处理速度上均有显著的提高。MPEG1可以满足多达16路以上25帧/秒的压缩速度,在500kbit/s的压缩码流和352像素×288行的清晰度下,每帧大小仅为2k。若从VCD到超级VCD到DVD的不同格式来看,MPEG1的352 ×288格式,MPEG2可有576×352、704 ×576等,用于CDROM上存储同步和彩色运动标视频信号,旨在达到VCR(模拟式磁带录放机Video Cassette Recorder;VCR)质量,其视频压缩率为26:1。MPEG1可使图像在空间轴上最多压缩1/38,在时间轴上对相对变化较小的数据最多压缩1/5。MPEG1压缩后的数据传输率为1.5Mbps,压缩后的源输入格式SIF(Source Input Format),分辨率为352像素×288行(PAL制),亮度信号的分辨率为360×240,色度信号的分辨率为180×120,每秒30帧。MPEG1对色差分量采用4:1:1的二次采样率。MPEG1、MPEG2是传送一张张不同动作的局部画面。在实现方式上,MPEG1可以借助于现有的解码芯片来完成,而不像M-JPEG那样过多依赖于主机的CPU。与软件压缩相比,硬件压缩可以节省计算机资源,降低系统成本。

M-JPEG:
MPEG压缩是根据运动图像相邻帧之间有一定的相似性原则,通过运动预测,参考前一帧图像与这一帧图像的相似情况,去掉与前一帧相似的冗余数据,而只记录这一帧与上一帧不同的数据,从而大大提高了视频数据的压缩效率,这种压缩方法也称为帧相关压缩。 MPEG压缩是以图像组(GOP)为一个单元的,由I帧B、P帧构成。一般情况下一个图像组(GOP)由15帧组成,第一帧为一个I帧,依次为1个P帧,2个B帧,由此构成I PBB PBB PBB……结构。I帧称为参考帧,所谓参考帧是其它帧都参考的起始帧,所以I帧是一个能够完全记载这一帧全部图像数据的帧。亦称作全帧。P帧是前向预测帧,是根据与前一帧图像的比较,去掉与前帧相似的数据而构成的帧。B帧是双向预测帧,是根据与前后一帧图像的比较而得到的帧。P、B帧是一个不完全帧,它需要依靠I帧而成立。可见MPEG有二大特点:
· 第一、 因为采用运动预 测帧压缩方式,针对视频压缩有很好的效果,在获得广播级数字视频质量的前提下,可以实现20:1的压缩效率,数据率可降至1M Byte/s(8M bit/s),一小时视频节目占用3.6GB空间。数据存储空间利用率高,网络传输效率是M-JPEG系统的5倍以上。
· 第二、 由于MPEG-II格式只有I帧是一个完整的帧。所以在电视需要帧精确 地进行剪接时会带来一的困难

转载于:https://www.cnblogs.com/Akagi201/archive/2012/04/03/2430772.html

    推荐阅读