AVI文件格式之RIFF格式参考

来源:互联网 发布:linux内核编译 ubuntu 编辑:程序博客网 时间:2024/04/28 22:21
微软的 AVI 文件格式是一种用于捕获、编辑和回放 audio-video 序列的 RIFF 文件规范。总体上讲,AVI 文件包含多个针对不同数据的流。 大部分 AVI 序列使用 audio 和 video 流。 一个简单的 AVI序列特例可以只包含 video 数据而不包含 audio 数据。

本部分并没有介绍 OpenDML 对于 AVI 文件格式的扩展。如果要对其深入研究, 请参考 OpenDML AVI M-JPEG 文件格式小组委员会出版的《OpenDML AVI File Format Extensions 》。

FOURCCs

一个 FOURCC( four-character code,4字符码)是一个包含4个ASCII码字符串的32位的无符号整型数据。例如, 在 Little-Endian 系统中, FOURCC 'abcd' 表示为 0x64636261。FOURCC中也可以包含空格,如 ' abc' 也是一个有效的FOURCC。 AVI 文件使用 FOURCC码标示流的类型、数据chunk、index元素, 和其他的信息。

RIFF 文件格式

AVI 文件格式是基于 RIFF ( resource interchange file format ) 文档格式的。一个 RIFF 文件包含一个RIFF 头, 以及其后的多个 list 和 chunk。

(1)RIFF 头的格式:

‘RIFF’+文件大小+文件类型+(数据)

'RIFF'就是FOURCC码'RIFF'。文件大小是一个表示文件中数据大小的4字节值。文件类型是一个FOURCC码,表示文件类型。文件大小,包含的是文件类型以及其后数据的大小,不包含FOURCC码'RIFF'和文件大小本身所占的空间。

(2)块(chunk)的格式:

ckID+ckSize+ckData

其中, ckID是一个说明该chunk中所包含的数据的FOURCC码。szSize 是表示 ckData 中数据大小的4字节数值。ckData是0个或多个字节的数据。数据总是填充到就近的WORD边界。ckSize表示的是chunk中有效数据的大小,它不包括填充部分的大小,以及ckID和ckSize所占的空间。

(3)List 格式:

'LIST'+listSize+listType+listData

'LIST'就是FOURCC码'LIST'。listSize是表示list大小的4字节数值。listType是一个FOURCC码。listData中是以任意顺序排列的多个list和chunk。listSize包含的是listType和listData的大小,而不包含FOURCC码'LIST'和文件大小本身所占的空间。

本文的余下内容,将用以下符号表示 RIFF chunk:

ckID ( ckData )。

其中chunk大小的概念比较模糊。使用以上符号,一个list可以表示为:

'LIST' ( listType ( listData ) )。

可选成员被放到了方括号中:[可选成员]

AVI RIFF Form

AVI 文件在 RIFF 头中用 FOURCC 码'AVI '标示。所有的AVI文件都被强制要求包含两个LIST 类型的chunk,分别定义了stream的格式和stream的数据。一个AVI文件还可能包含一个index chunk,其中包含了数据chunk在文件中的位置。包含以上部分的AVI文件的格式为:

RIFF ('AVI '      LIST ('hdrl' ... )      LIST ('movi' ... )      ['idx1' (<AVI Index>) ]     )

'hdrl' list定义了数据的格式,是第一个必须的LIST chunk。'movi' list包含了AVI序列中的数据,是第二个必须的LIST chunk。'idx1'list包含了index数据。这三部分在AVI文件中的顺序是特定的。

注意:OpenDML 扩展中定义了另外一种index,用FOURCC码'indx'进行标示。

'hdrl' list和'movi' list 用subchunk来表示它们的数据。 下面的例子列出了AVI RIFF文件的结构, 其中的list需要包含相应的chunk。

RIFF ('AVI '      LIST ('hdrl'            'avih'(<Main AVI Header>)            LIST ('strl'                  'strh'(<Stream header>)                  'strf'(<Stream format>)                  [ 'strd'(<Additional header data>) ]                  [ 'strn'(<Stream name>) ]                  ...                 )             ...           )      LIST ('movi'            {SubChunk | LIST ('rec '                              SubChunk1                              SubChunk2                              ...                             )               ...            }            ...           )      ['idx1' (<AVI Index>) ]     )

AVI Main Header

'hdrl' list的开头部分是一个包含主AVI header 的 'avih' chunk。主header中包含了AVI 文件的一些全局信息,如:文件中包含多少个流,AVI序列的宽高等等。主header chunk的内容可以用结构体 AVIMAINHEADER 表示。

AVI Stream Headers

主header 后面跟的是一个或多个'strl' list。每一个数据流都需要有一个'strl' list。每一个'strl' list都必须包含文件中一种流的信息,并且必须包含该流的header chunk('strh')和format chunk('strf')。另外,一个'strl' list还可能包含一个流的头数据chunk('strd')和一个流的名称chunk('strh')。

流的header chunk ('strh')可以用结构体 AVISTREAMHEADER 表示。

流的format chunk('strf')一定要跟在header chunk的后面。Format chunk描述了流中数据的格式。Format chunk中包含什么数据,依赖于流的类型。对于video流,其中的数据是一个BITMAPINFO结构体,如果指定的话其中将包含一个调色板。对于audio 流,其中的数据是一个WAVEFORMATEX 结构体。

如果包含流的header data chunk('strd'),它将紧随在流的format chunk('strf')之后。其格式已经包含的内容由codec driver来定义。通常情况下,drivers使用其中的数据作为配置信息。读或者写AVI文件的应用程序不需要解释这些信息,只需要作为一个内存块,传给driver,或者从driver处获取。

可选的'strn'chunk包含一个描述流的,以空字符为结尾的文本字符串。

'hdrl'list中流的头信息,按照其中'strl'chunk的顺序,与'movi'list中的流数据关联起来。其中,第一个'strl'chunk表示stream 0,第二个表示stream 1,以此类推。

Stream Data ( 'movi' list )

头信息的后面,是一个包含流的真实数据的'movi'list,这些数据包括视频帧、音频采样等。数据chunk 可以直接作为成员,存在于'movi'list中,也可以组成一个'rec 'list,整体作为一个成员,存在于'movi'list中。一个'rec 'list中包含的所有的chunk,应该一次从磁盘中读入到内存,这样是为了那些从磁盘交错播放的文件。

一个数据chunk的FOURCC码,前两个字节的数字信息,用来说明该chunk属于哪个流;后两个字节的字符信息,说明该chunk中数据的类型。

例如,如果stream 0 包含的是audio, 该流的data chunk将含有FOURCC码'00wb';stream 1包含的是video,该流的data chunk 将包含FOURCC码'01db'或者'01dc'。Video 的data chunk还可以在AVI序列中定义一个新的调色板条目。没一个 改变调色板(palette-change)的chunk( 'xxpc' )包含一个AVIPALCHANGE的结构体。如果一个流包含有调色板变更,该流的AVISTREAMHEADER结构体( strh )中的成员deFlags会被设置AVISF_VIDEO_PALCHANGES 标志。

文本流可以使用其他任意两个字符的编码。

AVI Index Entries

可选的index chunk('idx1')可以跟在'movi'list的后面。index包含了一个数据chunk和它们在文件中位置的列表(list)。它包含一个AVIOLDINDEX结构体,其中有针对每个数据chunk的条目,也包括'rec 'chunk。如果文件包含了index,AVIMAINHEADER结构体( 'avih' )中的成员dwFlags需要被设置AVIF_HASINDEX 标志。

Other Data Chunks

如果需要,可以在数据中插入'JUNK'chunk。应用程序应该忽略'JUNK'chunk所包含的内容。


参考地址:http://www.cnblogs.com/andriod-html5/archive/2010/06/19/2539618.html

英文原文地址:http://msdn.microsoft.com/en-us/library/ms779636.aspx

原创粉丝点击