1.概述
AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)
是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI
都采用这种格式存储。
2.RIFF文件结构
构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分:
1、4字节的数据块ID
2、数据块的大小
3、数据
这是一个chunk的例子
Chunk ID Size Data
avih 38 dwMicroSecPerFrame : 33367
dwMaxBytesPerSec : 3728000
......
整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。所有其他块都是RIFF块的子块,子块有两类,其中有一种子块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块。另一类不能包含子块的,暂且称为普通子块。可见RIFF文件是按树形结构被组织
下面是一个RIFF文件结构的例子
+ RIFF
| + LIST
| | + sub chunk
| | + LIST
| | | + sub chunk
| | | + sub chunk
| | | + sub chunk
| | + LIST
| | | + sub chunk
| | | + sub chunk
| | | + sub chunk
| | + sub chunk
| + LIST
| + sub chunk
RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下:
1、4字节的数据块标记(Chunk ID)
2、数据块的大小
3、4字节的形式类型或者列表类型
4、数据
3. AVI文件结构
AVI文件就是RIFF文件结构的一个具体应用。这就好比你基于xml文件格式设计了一个档案管理系统数据库。xml文件格式是一套描述内容该如何被组织起来的规则,你按照这个规则把档案数据组织起来,形成一个具体应用。这里xml文件格式就是RIFF文件格式,档案管理系统数据库就是AVI文件。
接下来我们看看AVI文件格式
AVI的RIFF块的形式类型是AVI,在RIFF块下,它包含3个子块,如下所述:
1、信息块,一个列表类型为"hdrl"的LIST块,定义AVI文件的数据格式。
2、数据块,一个列表类型为 "movi"的LIST块,包含AVI的音视频序列数据。
3、索引块,ID为 "idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。
+ RIFF-AVI
| + LIST-hdrl
| + LIST-movi
| + idx1
下面是一个AVI文件的例子,每行的格式是
CHUNK ID-FORMTYPE/LISTTYPE size:xxxxx
+ RIFF-AVI size:23370530
| + LIST-hdrl size:8810
| | + avih size:56
| | + LIST-strl size:4240
| | | + strh size:56
| | | + strf size:40
| | | + JUNK size:4116
| | + LIST-strl size:4218
| | | + strh size:56
| | | + strf size:18
| | | + JUNK size:4116
| | + JUNK size:260
| + LIST-movi size:23286940
| | + 00wb chunk
| | + 00dc chunk
| + idx1 size:74752
avih chunk描述文件整体信息,比如:包含的节目流数,最大数据传输率,是否有索引,图像的长宽。
strl list chunk描述一个数据流,一般avi有一个音频流和一个视频流,因此就会出现两个strl list chunk。 每个数据流由三个子块描述:strh,strf,strd。
strh包含如下信息:
FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流,auds 音频数据流
FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
DWORD dwFlags; //数据流属性
WORD wPriority; //此数据流的播放优先级
WORD wLanguage; //音频的语言代号
DWORD dwInitalFrames;//说明在开始播放前需要多少桢
DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
DWORD dwRate; //dwScale /dwRate = 每秒的采样数
DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
DWORD dwLength; //数据流的数据量,以dwScale为单位
DWORD dwSuggestedBufferSize; //建议缓冲区的大小
DWORD dwQuality; //解压缩质量参数,值越大,质量越好
DWORD dwSampleSize; //音频的采样大小
RECT rcFrame; //视频图像所占的矩形
"strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh 子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图结构,如下:
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
RGBQUAD bmiColors[1]; //颜色表
如果 strh子块是音频数据流,则strf子块的结构如下:
WORD wFormatTag;
WORD nChannels; //声道数
DWORD nSamplesPerSec; //采样率
DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
WORD nBlockAlign; //数据块的对齐标志
WORD biSize; //此结构的大小
"strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。
"strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。
数据块中存储视频和音频数据流,数据可直接存于 "movi" LIST块中。数据块中音视频数据按不同的子块存放,其结构如下所述,
"00wb" Wave 数据流
"00db" RGB数据流 或 "00dc" 压缩的图像数据流
avi文件的图像数据可以是压缩的,和非压缩格式的。对于压缩格式来说,也可采用不同的编码。AVI的编码方式有很多种,比较常见的有 mpeg2,mpeg4,divx等。
索引块,索引快包含数据块在文件中的位置索引,能提高avi文件的读写速度,其中存放着一组AVIINDEXENTRY结构数据 格式如下,这个块并不是必需的。
DWORD ckid; //记录数据块中子块的标记
DWORD dwFlags; //表示chid所指子块的属性
DWORD dwChunkOffset; //子块的相对位置
DWORD dwChunkLength; //子块长度
附录
一个包含完整信息块的avi例子
每行的格式为
POS CHUNK ID (size) FORMTYPE/LISTTYPE
00000000 RIFF (103E2920) 'AVI '
0000000C LIST (00000146) 'hdrl'
00000018 avih (00000038)
dwMicroSecPerFrame : 33367
dwMaxBytesPerSec : 3728000
dwPaddingGranularity : 0
dwFlags : 0x810 HASINDEX | TRUSTCKTYPE
dwTotalFrames : 2192
dwInitialFrames : 0
dwStreams : 2
dwSuggestedBufferSize : 120000
dwWidth