先放上这张图片,是让大家有一个直观的感受,avi就像一个容器,只要按照这个框架依次读取数据,就能很好的解析出数据来。鉴于本人习惯,我喜欢看图说话,所以接来下会放上很多avi格式的二进制图片,以便更好详细说明读取过程的信息。
(图1)
如图(1)所示,这是avi的二进制图,AVI文件利用AVI RIFF格式(RIFF(Resource Interchange FileFormat,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,)
构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分,
1、4字节的数据块标记(或者叫做数据块的ID)
2、数据块的大小
3、数据
整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。
RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下:
1、4字节的数据块标记(Chunk ID)
2、数据块的大小
3、4字节的形式类型或者列表类型
4、数据
图(2) 此处蓝线部分为整个avi大小。注
此处蓝线部分为整个avi大小。注
意:文件是从右往左读取,故而是(08 99 2B B6)=144255926字节~而我打开文件实际字节是144,255,934,这是因为前面的"RIFF"和本身这四个表示大小的数据字节没有算进去,故144255926+8=144 255 934。
紧接着后面四个字节表示AVI说明这是一个AVI格式的视频。
所有的AVI文件必须包含两个LIST块。这些块定义流格式和stream数据。AVI文件也可能包含一个索引块,此块定义文件中的数据块位置。包含上述组件的AVI文件的格式为:
RIFF ('AVI '
LIST ('hdrl'
)
LIST ('movi'