我的avi文件格式学习心得_第1页
我的avi文件格式学习心得_第2页
我的avi文件格式学习心得_第3页
我的avi文件格式学习心得_第4页
我的avi文件格式学习心得_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、 AVI文件格式学习笔记AVI文件格式 RIFF格式:AVI文件格式的基础是RIFFRIFF由一个RIFF文件头和一些LIST和CHUNK结构组成。RIFF文件头='RIFF'+4byte size+4byte ID(' avi')LIST='LIST'+4byte size+4byte ID+(LIST|CHUNK)CHUNK=4byte ID+4byte size+(data)-AVI格式:AVI文件包含1avi的riff头2.一个'hdrl' LIST3.一个'movi' LIST4可选的'idx1&

2、#39;主要内容都在hdrl(头信息)和movi(数据)里 -'hdrl' LIST包括1一个avih chunk2若干个 strl LIST(一般有2个,一个音频,一个视频)本段str表示stream3 其他 chunk-strl LIST包括strh(stream header)和strf(stream format)和可选的strdstream format 对于音频和视频的格式不同对于音频是如下结构WAVEFORMA|WAVEFORMATEX,后者是前者的扩展,这些结构可从MSDN中查到那么到底用的是什么结构可从strf这个CHUNK的size处获得,如果大于16则是后

3、者这个部分的解码似乎有些不规整,尤其在尾巴处理上,似乎有垃圾信息的处理?对于视频则是个BITMAPINFO结构,也可从MSDN中查到其中要注意codecid的识别AVI(Audio Video Interleaved的缩写)是一种RIFF(Resource Interchange File Format的缩写)文件格式,多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个AVI文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的AVI文件也是合法的。AVI可以算是Windows操作系统上最基本的、也是最常用的一种媒体文件格式。先来介绍

4、RIFF文件格式。RIFF文件使用四字符码FOURCC(four-character code)来表征数据类型,比如RIFF、AVI 、LIST等。注意,Windows操作系统使用的字节顺序是little-endian,因此一个四字符码abcd实际的DWORD值应为0x64636261。另外,四字符码中像AVI 一样含有空格也是合法的。 最开始的4个字节是一个四字符码RIFF,表示这是一个RIFF文件;紧跟着后面用4个字节表示此RIFF文件的大小;然后又是一个四字符码说明文件的具体类型(比如AVI、WAVE等);最后就是实际的数据。注意文件大小值的计算方法为:实际数据长度 + 4(文

5、件类型域的大小);也就是说,文件大小的值不包括RIFF域和“文件大小”域本身的大小。(如该位置数据为28 69 6B 00,则实际为0x006B6928,转换成十进制为7039272,实际在windows下看到的文件大小为7039280 bytes,即换算成实际大小时要加上8)RIFF文件的实际数据中,通常还使用了列表(List)和块(Chunk)的形式来组织。列表可以嵌套子列表和块。其中,列表的结构为:LIST listSize listType listData LIST是一个四字符码,表示这是一个列表;listSize占用4字节,记录了整个列表的大小;listType也是一个四字符码,表

6、示本列表的具体类型;listData就是实际的列表数据。注意listSize值的计算方法为:实际的列表数据长度 + 4(listType域的大小);(如该位置数据为5E 00 00 00,即0x0000005E,转换成十进制为94,实际总长为102 bytes,即换算成列表总长是要加上8。但是有一点要特别注意的是,当前List具体包括到哪里,可能会有List嵌套。如截图中,选中的部分为一个hdrl的List;其中包含两个strl的List,一个音频,一个视频;每个strl List又包含一个strh和一个strf) 也就是说listSize值不包括LIST域和listSize域本身的大小。再来

7、看块的结构:ckID ckSize ckData ckID是一个表示块类型的四字符码;ckSize占用4字节,记录了整个块的大小;ckData为实际的块数据。注意ckSize值指的是实际的块数据长度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的内容中,将以LIST ( listType ( listData ) )的形式来表示一个列表,以ckID ( ckData )的形式来表示一个块,如 optional element 中括号中的元素表示为可选项。)接下来介绍AVI文件格式。AVI文件类型用一个四字符码AVI 来表示。整个AVI文件的结构为:一个RIFF头 + 两个列表(

8、一个用于描述媒体流格式、一个用于保存媒体流数据) + 一个可选的索引块。AVI文件的展开结构大致如下: RIFF (AVI       LIST (hdrl            avih(主AVI信息头数据)            LIST (strl     

9、60;            strh (流的头信息数据)                  strf (流的格式信息数据)                &#

10、160; strd (可选的额外的头信息数据)                   strn (可选的流的名字)                   .         

11、        )             .           )      LIST (movi            SubChunk | L

12、IST (rec                               SubChunk1                  

13、;            SubChunk2                              .        

14、;                     )               .                

15、        .           )      idx1 (可选的AVI索引块数据)      ) 首先,RIFF (AVI )表征了AVI文件类型。然后就是AVI文件必需的第一个列表hdrl列表,用于描述AVI文件中各个流的格式信息(AVI文件中的每一路媒体数据都称为一个流)。hdrl列表嵌套了一系列块和子列表首先是一个

16、avih块,用于记录AVI文件的全局信息,比如流的数量、视频图像的宽和高等,可以使用一个AVIMAINHEADER数据结构来操作: typedef struct _avimainheader     FOURCC fcc;   / 必须为avih    DWORD  cb;    / 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)    DWORD  dwMicroSecPerFrame;  

17、 / 视频帧间隔时间(以毫秒为单位)    DWORD  dwMaxBytesPerSec;     / 这个AVI文件的最大数据率    DWORD  dwPaddingGranularity; / 数据填充的粒度    DWORD  dwFlags;         / AVI文件的全局标记,比如是否含有索引块等    DW

18、ORD  dwTotalFrames;   / 总帧数    DWORD  dwInitialFrames; / 为交互格式指定初始帧数(非交互格式应该指定为0)    DWORD  dwStreams;       / 本文件包含的流的个数    DWORD  dwSuggestedBufferSize; / 建议读取本文件的缓存大小(应能容纳最大的块)  

19、0; DWORD  dwWidth;         / 视频图像的宽(以像素为单位)    DWORD  dwHeight;        / 视频图像的高(以像素为单位)    DWORD  dwReserved4;   / 保留 AVIMAINHEADER; 然后,就是一个或多个strl子列表。(文件中有多少个流,这里就对

20、应有多少个strl子列表。)每个strl子列表至少包含一个strh块和一个strf块,而strd块(保存编解码器需要的一些配置信息)和strn块(保存流的名字)是可选的。首先是strh块,用于说明这个流的头信息,可以使用一个AVISTREAMHEADER数据结构来操作: typedef struct _avistreamheader      FOURCC fcc;  / 必须为strh     DWORD  cb;   / 本数据结构的大小,不包括最初的8个字节(

21、fcc和cb两个域)FOURCC fccType;    / 流的类型:auds(音频流)、vids(视频流)、                   /mids(MIDI流)、txts(文字流)     FOURCC fccHandler; / 指定流的处理者,对于音视频来说就是解码器     DWORD&#

22、160; dwFlags;    / 标记:是否允许这个流输出?调色板是否变化?     WORD   wPriority;  / 流的优先级(当有多个相同类型的流时优先级最高的为默认流)     WORD   wLanguage;     DWORD  dwInitialFrames; / 为交互格式指定初始帧数     DWORD 

23、dwScale;   / 这个流使用的时间尺度     DWORD  dwRate;     DWORD  dwStart;   / 流的开始时间     DWORD  dwLength;  / 流的长度(单位与dwScale和dwRate的定义有关)     DWORD  dwSuggestedBufferSize; / 读取这个流数据建议使用的

24、缓存大小     DWORD  dwQuality;    / 流数据的质量指标(0 10,000)     DWORD  dwSampleSize; / Sample的大小     struct          short int left;         sho

25、rt int top;         short int right;         short int bottom;  rcFrame;  / 指定这个流(视频流或文字流)在视频主窗口中的显示位置             / 视频主窗口由AVIMAINHEADER结构中的dwWidth和dw

26、Height决定 AVISTREAMHEADER; 然后是strf块,用于说明流的具体格式。如果是视频流,则使用一个BITMAPINFO数据结构来描述;如果是音频流,则使用一个WAVEFORMATEX数据结构来描述。=typedef struct WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; WAVEFORMATEX; 其中参数的解释是:WAVEFORMATEX wfSrc

27、;memset(&wfSrc, 0, sizeof(wfSrc);wfSrc.cbSize = 0;wfSrc.wFormatTag = WAVE_FORMAT_PCM; /PCM脉冲编码调制 (这里主要是针对音频,一般大体分只有pcm和非pcm)wfSrc.nChannels = 1; /单声道wfSrc.nSamplesPerSec = 11025; /11.025kHz(抽样率)wfSrc.wBitsPerSample = 8; /8 bit(抽样编码比特数)wfSrc.nBlockAlign = wfSrc.nChannels * wfSrc.wBitsPerSample /

28、8; (就是字节对齐,对于一般的音频字节对齐是比较小的,但是对于视频就可能比较大,比如特殊视频还可能有几万的nBlockAlign)wfSrc.nAvgBytesPerSec = wfSrc.nSamplesPerSec * wfSrc.nBlockAlign;(平均字节率)=位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:typedef struct tagBITMAPINFO

29、 /* bmi */ BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors1; BITMAPINFO; 其中: bmiHeader 说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息bmiColors 说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。 BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:typedef struct tagBITMAPINFOHEADER /* bmih */ DWORD biSize; LONG biWidth; LONG biHei

30、ght; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; BITMAPINFOHEADER; 其中: biSize 说明BITMAPINFOHEADER结构所需要的字数。注:这个值并不一定是BITMAPINFOHEADER结构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADE

31、R)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像都是BITMAPINFOHEADER结构的(可能是后两者太新的缘故吧:-)。 biWidth 说明图象的宽度,以象素为单位 biHeight 说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个负数时(正向图像),图像将不能被压缩(也就是说biCompression成员将

32、不能是BI_RLE8或BI_RLE4)。 biPlanes 为目标设备说明位面数,其值将总是被设为1 biBitCount 说明比特数/象素,其值为1、4、8、16、24、或32 biCompression 说明图象数据压缩的类型。其值可以是下述值之一: BI_RGB:没有压缩; BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引); BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成 BI_BITFIELDS:每个象素的比特由指定的掩码决定。 biSizeImage 说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0

33、biXPelsPerMeter 说明水平分辨率,用象素/米表示 biYPelsPerMeter 说明垂直分辨率,用象素/米表示 biClrUsed 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项) biClrImportant 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。=当AVI文件中的所有流都使用一个strl子列表说明了以后(注意:strl子列表出现的顺序与媒体流的编号是对应的,比如第一个strl子列表说明的是第一个流(Stream 0),第二个strl子列表说明的是第二个流(Stream 1),以此类推),hdrl列表的任务也就完成了,随后

34、跟着的就是AVI文件必需的第二个列表movi列表,用于保存真正的媒体流数据(视频图像帧数据或音频采样数据等)。那么,怎么来组织这些数据呢?可以将数据块直接嵌在movi列表里面,也可以将几个数据块分组成一个rec 列表后再编排进movi列表。(注意:在读取AVI文件内容时,建议将一个rec 列表中的所有数据块一次性读出。)但是,当AVI文件中包含有多个流的时候,数据块与数据块之间如何来区别呢?于是数据块使用了一个四字符码来表征它的类型,这个四字符码由2个字节的类型码和2个字节的流编号组成。标准的类型码定义如下:db(非压缩视频帧)、dc(压缩视频帧)、pc(改用新的调色板)、wb(音缩视频)。比

35、如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为00wb;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为00db或00dc。对于视频数据来说,在AVI数据序列中间还可以定义一个新的调色板,每个改变的调色板数据块用xxpc来表征,新的调色板使用一个数据结构AVIPALCHANGE来定义。(注意:如果一个流的调色板中途可能改变,则应在这个流格式的描述中,也就是AVISTREAMHEADER结构的dwFlags中包含一个AVISF_VIDEO_PALCHANGES标记。)另外,文字流数据块可以使用随意的类型码表征。=typedef struct BYTE bFir

36、stEntry; BYTE bNumEntries; WORD wFlags; PALETTEENTRY peNew; AVIPALCHANGE;MembersbFirstEntrySpecifies the index of the first palette entry to change.bNumEntriesSpecifies the number of palette entries to change, or zero to change all 256 palette entries.wFlagsReserved.peNewSpecifies an array of PALETT

37、EENTRY structures, of size bNumEntries.RequirementsHeader: Aviriff.h.=最后,紧跟在hdrl列表和movi列表之后的,就是AVI文件可选的索引块。这个索引块为AVI文件中每一个媒体数据块进行索引,并且记录它们在文件中的偏移(可能相对于movi列表,也可能相对于AVI文件开头)。索引块使用一个四字符码idx1来表征,索引信息使用一个数据结构来AVIOLDINDEX定义。 typedef struct _avioldindex    FOURCC  fcc;  / 必须为idx1&

38、#160;  DWORD   cb;   / 本数据结构的大小,不包括最初的8个字节(fcc和cb两个域)   struct _avioldindex_entry       DWORD   dwChunkId;   / 表征本数据块的四字符码      DWORD   dwFlags;     / 说明本数据块是不是关键帧、是

39、不是rec 列表等信息      DWORD   dwOffset;    / 本数据块在文件中的偏移量      DWORD   dwSize;      / 本数据块的大小  aIndex; / 这是一个数组!为每个媒体数据块都定义一个索引信息 AVIOLDINDEX; 注意:如果一个AVI文件包含有索引块,则应在主AVI信息头的描述中,也就是AVIMA

40、INHEADER结构的dwFlags中包含一个AVIF_HASINDEX标记。还有一种特殊的数据块,用一个四字符码JUNK来表征,它用于内部数据的队齐(填充),应用程序应该忽略这些数据块的实际意义。 提示:上述关于AVI文件格式的介绍,并不包括OpenDML AVI M-JPEG文件格式小组制定的OpenDML AVI文件格式扩展部分的内容。想对该扩展部分有更多了解的读者,请另行参考“OpenDML AVI File Format Extensions”一文(此文可在Internet上搜索获得)。=AVI Data Structures typedef struct unsigned

41、 long dwMicroSecPerFrame; unsigned long dwMaxBytesPerSec; unsigned long dwReserved1; unsigned long dwFlags; unsigned long dwTotalFrames; unsigned long dwInitialFrames; unsigned long dwStreams; unsigned long dwSuggestedBufferSize; unsigned long dwWidth; unsigned long dwHeight; unsigned long dwScale; unsigned long dwRate; unsigned long dwStart; unsigned long dwLength; MainAVIHeader; #define AVIF_HASINDEX 0x00000010 #define AVIF_MUSTUSEI

温馨提示

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

评论

0/150

提交评论