AVI RIFF 文件参考
[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayer、IMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayer、IMFMediaEngine 和 Media Foundation 中的音频/视频捕获,而不是 DirectShow。 Microsoft建议重写使用旧 API 的现有代码,以尽可能使用新 API。]
Microsoft AVI 文件格式是一种 RIFF 文件规范,用于捕获、编辑和播放音频视频序列的应用程序。 通常,AVI 文件包含多种类型的数据流。 大多数 AVI 序列都使用音频和视频流。 AVI 序列的简单变体使用视频数据,不需要音频流。
本部分不介绍 OpenDML AVI 文件格式扩展。 有关这些扩展的详细信息,请参阅 openDML AVI M-JPEG 文件格式小组委员会发布的 OpenDML AVI 文件格式扩展。
FOURC
FOURCC(四个字符代码)是通过连接四个 ASCII 字符创建的 32 位无符号整数。 例如,FOURCC“abcd”在 Little-Endian 系统上表示为0x64636261。 FOURC 可以包含空格字符,因此“abc”是有效的 FOURCC。 AVI 文件格式使用 FOURCC 代码标识流类型、数据区块、索引条目和其他信息。
RIFF 文件格式
AVI 文件格式基于 RIFF(资源交换文件格式)文档格式。 RIFF 文件由 RIFF 标头组成,后跟零个或多个 列表, 和 区块。
RIFF 标头具有以下形式:
'RIFF' fileSize fileType (data)
其中,“RIFF”是文本 FOURCC 代码“RIFF”,
fileSize
是一个 4 字节值,提供文件中数据的大小,fileType
是用于标识特定文件类型的 FOURCC。fileSize
的值包括fileType
FOURCC 的大小加上以下数据的大小,但不包括“RIFF”FOURCC 的大小或fileSize
的大小。 文件数据按任意顺序由区块和列表组成。区块具有以下形式:
ckID ckSize ckData
其中,
ckID
是一个用于标识区块中包含的数据的 FOURCC,ckSize
是一个 4 字节值,提供ckData
中的数据大小,ckData
为零或更多字节的数据。 数据始终填充到最接近的 WORD 边界。ckSize
提供区块中有效数据的大小;它不包括填充、ckID
的大小或ckSize
的大小。列表具有以下形式:
'LIST' listSize listType listData
其中,“LIST”是文本 FOURCC 代码“LIST”,
listSize
是一个 4 字节值,它提供列表的大小,listType
是 FOURCC 代码,listData
按任意顺序包含区块或列表。listSize
的值包括listType
的大小加上listData
的大小;它不包括“LIST”FOURCC 或listSize
的大小。
本部分的其余部分使用以下表示法来描述 RIFF 区块:
ckID ( ckData )
其中区块大小为隐式。 使用此表示法,列表可以表示为:
'LIST' ( listType ( listData ) )
可选元素放在括号中:[ optional element ]
AVI RIFF 表单
AVI 文件由 RIFF 标头中的 FOURCC“AVI”标识。 所有 AVI 文件都包含两个必需的 LIST 区块,分别定义流和流数据的格式。 AVI 文件可能包括索引区块,该区块提供文件中的数据区块的位置。 包含以下组件的 AVI 文件:
RIFF ('AVI '
LIST ('hdrl' ... )
LIST ('movi' ... )
['idx1' (<AVI Index>) ]
)
“hdrl”列表定义数据的格式,是第一个必需的 LIST 区块。 “movi”列表包含 AVI 序列的数据,并且是第二个必需的 LIST 区块。 “idx1”列表包含索引。 AVI 文件必须按正确的顺序保留这三个组件。
注意
OpenDML 扩展定义由 FOURCC“indx”标识的另一种类型的索引。
“hdrl”和“movi”列表对其数据使用子分类。 以下示例显示了展开的 AVI RIFF 窗体,其中包含完成这些列表所需的区块:
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 主标头
“hdrl”列表以主 AVI 标头开头,该标头包含在“avih”区块中。 主标头包含整个 AVI 文件的全局信息,例如文件中的流数以及 AVI 序列的宽度和高度。 主标头区块由 AVIMAINHEADER 结构组成。
AVI 流标头
一个或多个“strl”列表遵循主标头。 每个数据流都需要“strl”列表。 每个“strl”列表都包含有关文件中一个流的信息,并且必须包含流标头区块('strh')和流格式区块('strf')。 此外,“strl”列表可能包含流标头数据区块('strd')和流名称区块('strn')。
流标头区块('strh')由 AVISTREAMHEADER 结构组成。
流格式区块('strf')必须遵循流标头区块。 流格式区块描述流中的数据格式。 此区块中包含的数据取决于流类型。 对于视频流,信息是 BITMAPINFO 结构,包括调色板信息(如果适用)。 对于音频流,信息是一种 波形信号 结构。
如果存在流标头数据('strd')区块,则它遵循流格式区块。 此区块的格式和内容由编解码器驱动程序定义。 通常,驱动程序将此信息用于配置。 读取和写入 AVI 文件的应用程序不需要解释此信息;它们以内存块的形式简单将其传输到驱动程序和从驱动程序传输。
可选的“strn”区块包含描述流的以 null 结尾的文本字符串。
“hdrl”列表中的流标头根据“strl”区块的顺序与“movi”列表中的流数据相关联。 第一个“strl”区块适用于流 0,第二个区块适用于流 1,依此类推。
流数据(“movi”列表)
在标头信息之后是一个“movi”列表,其中包含流中的实际数据,即视频帧和音频示例。 数据区块可以直接驻留在“movi”列表中,也可以将其分组到“rec”列表中。 “rec”分组意味着应同时从磁盘中读取分组区块,并且用于交错以从 CD-ROM 播放的文件。
标识每个数据区块的 FOURCC 由两位数的流号组成,后跟一个用于定义区块中信息的两个字符代码。
双字符代码 | 描述 |
---|---|
分贝 | 未压缩的视频帧 |
直流 | 压缩的视频帧 |
个人电脑 | 调色板更改 |
工 务 局 | 音频数据 |
例如,如果流 0 包含音频,该流的数据区块将具有 FOURCC“00wb”。 如果流 1 包含视频,该流的数据区块将具有 FOURCC“01db”或“01dc”。 视频数据区块还可以定义新的调色板条目,以在 AVI 序列期间更新调色板。 每个调色板更改区块(“xxpc”)都包含 AVIPALCHANGE 结构。 如果流包含调色板更改,请将 dwFlags 中的 AVISF_VIDEO_PALCHANGES 标志设置为该流的 AVISTREAMHEADER 结构的成员。
文本流可以使用任意两个字符的代码。
AVI 索引项
-
AVI 1.0 索引
-
可选索引('idx1')区块可以遵循“movi”列表。 索引包含数据区块的列表及其在文件中的位置。 它包含一个 AVIOLDINDEX 结构,其中包含每个数据区块的条目,包括“rec”区块。 如果文件包含索引,请将 dwFlags 中的 AVIF_HASINDEX 标志设置为 AVIMAINHEADER 结构的成员 成员。
-
AVI 2.0 索引
-
AVI 2.0 索引可以显示为单个区块。 或者,可以在“movi”区块内交错索引段。 如果索引段放置在“movi”区块中,则超级索引包含索引段的索引。 AVIMETAINDEX 结构是索引段和超级索引的基本结构。 有关详细信息,请参阅 OpenDML AVI M-JPEG 文件格式小组委员会发布的 OpenDML AVI 文件格式扩展。 (此资源可能在某些语言和国家/地区不可用。
其他数据区块
可以通过根据需要插入“垃圾邮件”区块,在 AVI 文件中对齐数据。 应用程序应忽略“垃圾邮件”区块的内容。
相关主题