AVI文件格式及其应用研究_第1页
AVI文件格式及其应用研究_第2页
AVI文件格式及其应用研究_第3页
AVI文件格式及其应用研究_第4页
AVI文件格式及其应用研究_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、avi文件格式及其应用研究 摘要:av1文件是windows操作系统下最常用的流媒体文件格式之一,了解av1 文件格式是正确使用avi文件的基础,以一个具体的avi文件的二进制码为例, 详细解释和研究avi文件的各个字段的具体含义,并指出avi-1文件与avi-2文 件格式的区别,在此基础上,可以对avi文件进行各种编程操作。给出使用vfw(v ideoforwindows)用visualc编程语言从avi-2文件中获取视频帧,转换为bmp 图像,加以显示并存储为位图文件的编程方法。关键词:流媒体文件;vc;avi;vfw中图分类号:tp311. 1文献标识码:a文章编号:1004-373x(

2、2008)02-119- 04studyonavlfileformatandltsapplicationxudianwu(mechano-electsoniccollege, chinauniversityofpetroleum, beijing, 102 249,china)abstract: undcrwindowsenvironmcnt, aviisapopu1arstrcammediaformat toworkwithav1fi1e, itisthebasictoknowaboutavlfileformat inthispaper, th eexampleofavifilebinary

3、codeispresentedinbinarycode, toillustrateeveryc hunkinthefile.theformatofavifiles, andespeciallythedifferencebetweenav t1andavt2formati sdi scussed. programmingmethodforpickupvideosfromanav if ilea ndsqvciteisbmpf ilcsi nv isueilc isprcsc ntcd keywords: streammediumfile;vc;av1;vfw1引言口微软公司推出avi文件格式以來

4、,avi逐渐成为windows操作系统上最常 用的流媒体文件格式z 1。av1是视频数据和音频数据交叉编码(audiovi deolnterleaved)的一种riff文件,其多用于音视频捕捉、编辑、播放等,其文 件名后缀为.avio应用程序的开发者在编写多媒体处理软件吋,除要对avi文件 进行播放、编辑、制作外,也经常需要从一个avi文件中提取一视频帧并存储为 bmp图像文件,这些都需要对avi文件格式有深入了解,本文在对avi文件格式进 行解析的基础上,给出了从av1文件中获取位图的程序设计方法。这里介绍的av i文件格式不包-opendmlavim-jpeg文件格式分委员会制定的内容以及

5、navi (- 种改进的asf格式)的内容。2riff文件格式简介riffcresourcelnterchangefileformat)文件格式是一个信息交换框架1, avi文件格式是以riff为基础的,所以在很多文献屮,avi文件又被称为aviriff 文件2。riff文件组成的基木单元叫作“块” (chunk),使用f0urcc码(fourch肛 actercode, 4字符码,windows屮的数据类型为f0urcc)来标识文件屮的每个块。 f0urcc是由4个ascii码组成的一个dword型数据,高字节在后,如4字符abed 的f0urcc码是0x6463626lo riff就是一个

6、f0urcc,表示这是一个riff块。在 一个riff文件中,除riff块和list块可以包含了块(subchunk)夕卜,其他任何 块均不可以包含子块。块的格式分为2种,可以包含子块的块(riff, list)的格式为:fourcc.块 长度(4字节,dword类型,长度不包括fourcc和块长度占用的8个字节)、块数 据类型、块数据。不可以包含子块的块的格式是:fourcc块长度、块数据,没 有块数据类型部分。3avi文件格式avi文件是一种最复杂的riff文件。现在常用的avi文件有2种:avt-1 和avi-2o在avi-2文件中,通常包含2个流,一个视频流和一个咅频流(被称为 标准a

7、v1格式),但只冇一个视频流或音频流也是合法的。在avi-1文件屮只包 含一个dv (digitalvideo)数据流(视频采集设备的输出数据,其中既有视频信 息也有音频信息),在文件屮以单个流的形式存在,其主要优点是占用较少的存储 空间,对avt-1的支持主要来自direct show中的dvmuxer和dvspl i tter筛选器 (filter) 2。虽然目前avi-2仍然是最常使用的格式,但avi-1由于其自身 的优点和受到微软最新技术的支持,将来可能会比av1-2更流行。虽然这2种av i文件不兼容,但他们都以riff格式为基础,除了实际的流数据格式不同以外,差 别主要存在于文件的

8、strh块和strf块。下面为avt文件的格式,左边小括号处省略了 4字节的文件大小或列表大小 或块大小,凡fourcc都用4个字母表示,除riff和list外,所有的4字符码都用 单引号括起来,方括号表示可选:riff (7 avio, jy/riff文件头,块的数据类型是avi,jyo表示空格。listc hdrr jy/列表,列表中的数据类型是hdrl,jy下而紧跟avih子块。'avih' (avi文件的全局信息,本行构成一个avimainheader结构,长度为6 4个字节)oist( strv jy/strl列表,表示本列表是一个流的列表,jy其后紧跟strh 了块

9、。7 strh7 (jy/流的头信息,本行构成一个avi streamheaderjy结构,氏度为64字节)'stif (jy/流的格式信息子块,描述流中数据的格式。)strd,(jy/附加的流头数据,一般为jy编解码器驱动程序所定义)stn?(以0结束的字符串,流的名字) ) )jy/hdrl列表块到此结束list(, movi, jy/movi列表块,包含了流的实际数据,jy数据可以是子块,也可以将子块组织成rec列表,jy 个rec列表屮的数据应该一次性地从磁盘读出。subchunk|list(' rec'subchunklsubchunk2)/movi歹!j表块

10、到此结束z idxv (索引块)ncwpagc) /riff块到此结束,这就是一个完整的aviriff文件从上而的格式可以看岀,一个av1r1ff文件由3大部分组成:riff文件头;h drl列表;movi列表。其中hdrl列表包含avih子块和strl子列表,文件中有多 少个流,hdrl歹!j表中就有多少个strl子列表,strl子列表在hdrl中的次序就是 流的序号(隐含)。strl t 列表由 strh t 块、strf t 块、st rd t 块(可选)、strn t 块(可 选)构成。movi列表屮存储的是流的实际数据,movi列表屮数据子块的种类冇: #db, #dc, #pc,

11、#wb,其中#表示数据所属的流的序号,如oodb, 01dco db表示 未压缩的视频帧;de表示压缩的视频帧;wb表示音频数据;pc表示调色板变化,其 后的数据是一个avtpalchange结构,此时strh中的dwflages字段必须置为avt sf_video_palchangesomovi列表最后可以冇一个可选的索引块(idxl),他指出流的数据在文件屮 的位置,以便于对数据进行随机访问。一个aviriff文件如果有索引块,则将avi mainheader结构中的dwflags字段置为avif_hasindexo avi文件中的junk块 为数据对齐而存在,应用程序应该忽略junk奠的

12、内容。avi-1 中只有一个流(dvdatastrcam),其 avistreamiieader(strh 块)中的 f cctype 字段是 4 字符码,iavs7 , fcchandler 字段是,dvsd' , ' dvhdz , ' dvs r三者之一(分别对应3种dv格式),strl子列表中的strf块是dvinfo结构 (32字节)o avi-2中一般有2个流,视频流的avistreamheader (strh块)中 的 fcctype 字段是 4 字符码'vids'(也口j以是'dvsd', dvhd' , '

13、; dvslf 三 者z)2,咅频流的4字符码是'suds',其视频流的strl 了列表中的strf 块是b1tmap1nfoheader结构(40字节),其后可以跟随dv1nf0结构。av1-2中 音频流的strf块是waveformatex结构。aviriff文件格式只规定了文件的组成方式,即各种数据如何在文件屮排列 等,对于文件中的数据并没冇做出编码格式的约束,如mpeg-l、divx等都可以作 为文件中数据的编码格式。数据也可以未经压缩。avi文件可以看成是一个数据 容器,av1格式只规定了将数据装入这个容器的方法,但对数据本身的编码格式 并不涉及。要操作一个avi文件

14、(播放、抓图、编辑),必须在系统中安装与该 avi文件屮的编码器对应的解码器,才能进行正确的工作。4avi-2文件格式的例下面以avi文件bfh. avi (风景介绍片)为例,将该avi文件打开,逐字节解 释其屮的数据(见图1):52494646是riff的ascii码;7e443400是文件长度,高位字节在后,(003 4447e)16, (3425406)10; 41564920 是 av1的 ascii 码,表示空格;表示riff块(文件)的数据类型是avi。4c495354是list的ascii码,表示这 是一个列表。10h开始的4字节表示木列表长度,(132)16, (306)10。

15、接着6864726c是hdrl的asch码,表明这是hdrl列表,61766968是avih的as cii码,表明这是hdrl列表中的avih块,第二行最后4字节是16进制的3&十进 制的56;表示avih块的长度是56个字节(加上8正好是av1ma1nheader结构 的长度),接下来的56个字节就是avih的内容,描述avi文件的整体信息,avim ainheader结构屮各个字段的内容不再分析,avih块到057h结束。从0058h开始的4c495354是ijst的asctt码,其后4字节(74)16,即(116)10是木列表的大小。60h开始的7374726c是strl的asc

16、ii码,表示这是strl (流)列表,从64h到a3h的64个字节是一个avi streamheader结构; 64h开始的73747268是strh的ascii码,表示这是strl列表中strh块(流的 头信息);下面的4字节是strh块的大小(38)16,1-进制的56, 76696473是vids的ascii码,是流的类型,表示这是一个视频流,从上面对avi的2种格式 的分析可知,这是一个avi-2文件,如果是avi-1文件,此处应该是iavs的ascii 码。70h开始的4字节是'msvc'(已经注册的解码器的4字符码)的ascii码 4d535643, avi str

17、eamheader结构其他字段不再罗列,90h这一行最后4个字节, 表示显示窗口左上角 x, y,其值为0, 0。aoh开始的2字节是窗口显示的右下 角x坐标,值为十进制的12&以象索为单位,再2字节是右下角y 坐标, 十进制的112,至此,avistreamiieader结束。a4h开始的4字节是strf的ascii码73747266,后跟的4字节(28)16,(40)10是strf块的氏度,前面说过,在avi-2中,如果是视频流,strf就是一个bitmapinfoheader结构,而该结构的长度是40字节,再后的4字节(28) 16,就是bttmaptnfoheader的第一个字

18、段,指明该结构的长度,所以冇2个(28) 16相连。从boh开始,就是bitmapinfoiieader其余的内容,(80)16是图像的宽度,120象素。(70)16是图像的高度,112象素,这些都与前而的信息相符合。0001两字节是位平面数,(0018)16是每彖素比特数(24位)。接下来4字节44495633是'div3f (压缩编码格式的四字符码)的ascii码,是b ttmaptnfoheader的bicompression域的值,指压缩方式,这是和普通的bmp文件 不同的。后面的字段不再分析。值得指出的是,这里可以后跟一个dvinfo结构(可 选),如果是av1-1文件,这里

19、用dv1nf0结构取代bitmapinfoheader结构。接下 来的4c495344是list的ascii码,表明下面乂是一个列表,列表大小是6ah, doh 行最后4字节是strl的ascii码,表明这是-个“流”列表。后面的数据不再分 析。5从avi文件屮捉取位图windows提供的vfw和directshow 3都可以处理和操作avi文件,考虑到 vfw为人多数程序员所熟悉以及avt-2仍然是最常使用的avi文件格式,下面给 出使用vfw从avi-2文件中提取视频帧加以显示并存储为bmp位图文件的程序。vfw提供的avif订e动态链接库使用ole技术实现,在avif订e中的api函 数

20、将avi文件中的数据当作“流”来处理,而不必逐一地寻找其屮的块(chunk) o 使用该库要首先调用函数avif订cinit来初始化,使用完毕调用函数avif订cexi t后释放。首先使用mfcappwizard创建一个名为avi的单文档项目,然后重载c document类的虚函数onopendocument,在此函数中打开avi文件,读出其中的视 频帧,存储为bmp文件并在屏幕上加以显示(在vc 6.0屮调试通过):newpageboolcavidoc:0n0pcndocument(lpctstrlpszpathname)i f(!cdocument:onopendocument(ipszp

21、athname) returnfalse;avifil einit();jy/初始化avif订eopen (&pavifile, ipszpathname, of_share_deny_write, 01);jy/ 打开avi文件avifilcgetstrcam(pavifilc, &pavistrcam, strcamtypcvideo, 0l);jy/ 打开流avistreamlnfo(pavistream, feavistrlnfo, sizeof(avistreaminfo);jy/ /获取流的信息longlstreamsize; jy/流格式长度pbmpinfoii=

22、ncwbitmapinfoheader; jy/pbmpinfoii 是文档类的成员变量avistreamformatsize(pavistream, 0, &istreamsize) ; jy/获取流的格式 信息的长度avtstreamreadformat(pavistream, 0l, pbmptnfoh,&istreamsize); pgetpgf;pgf=av!streamgetopen(pavistream, null) ; jy/为解压帧做准备 jy/解压读出笫0帧,紧缩dib的数据以返冋值pdata为起始地址 pdata= (lpbyte)avistreamget

23、 (pgf, 0l) ; jy/文档类的成员变量,类型为lpbytepbmp inf ol i->b i comprc ssi on 二 0;bitmapfileheaderbmpfh; jy/位图文件头bmpfh. bftype二0x4d42;bmpfh.bfsize=bmpinfoh. biwidth*bmpinfoh. biheight*3 54;bmpfh.bfreserved1=0;bmpfh. bfreserved2=0;bmpfil bfoffbits二54;cfil edialogdig (false) ; jy/获取用户要存储成的位图文件名和路径 if (idok=dlg. domodal () str. format (s,dig. getpathname (); cfilebmp(str, c:modewrite|c:modecreate);bmp.write(&bmpfh, sizeof (bttmapftleheader) ;jy/写入位图文件头 bmp. writciiugc(pdata, bmpfil bfsizc-14) ; jy/写入紧缩 dib bmp. close() ;avifileexit ();updateal

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论