AVI RIFF 文件参考

[与此页面关联的功能(DirectShow)是一项旧功能。 它已被 MediaPlayerIMFMediaEngine取代,并在媒体基金会 音频/视频捕获。 这些功能已针对 Windows 10 和 Windows 11 进行了优化。 Microsoft强烈建议新代码尽可能使用 MediaPlayerIMFMediaEngineMedia 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 文件中对齐数据。 应用程序应忽略“垃圾邮件”区块的内容。

AVI 文件格式