AVI RIFF 文件参考

[与此页面关联的功能 DirectShow 是旧版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音频/视频捕获所取代。 这些功能已针对Windows 10和Windows 11进行了优化。 Microsoft 强烈建议新代码尽可能在 Media Foundation 中使用 MediaPlayerIMFMediaEngine音频/视频捕获 ,而不是 DirectShow。 如果可能,Microsoft 建议重写使用旧 API 的现有代码以使用新 API。]

Microsoft AVI 文件格式是一种 RIFF 文件规范,用于捕获、编辑和播放音频-视频序列的应用程序。 通常,AVI 文件包含多个不同类型的数据流。 大多数 AVI 序列同时使用音频和视频流。 AVI 序列的简单变体使用视频数据,不需要音频流。

本部分不介绍 OpenDML AVI 文件格式扩展。 有关这些扩展的详细信息,请参阅 OpenDML AVI 文件格式小组委员会发布的 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 包括 FOURCC 的大小 fileType 加上后续数据的大小,但不包括 “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”列表以main AVI 标头开头,该标头包含在“avih”区块中。 main标头包含整个 AVI 文件的全局信息,例如文件中的流数以及 AVI 序列的宽度和高度。 main标头区块由 AVIMAINHEADER 结构组成。

AVI 流标头

一个或多个“strl”列表紧跟main标题。 每个数据流都需要“strl”列表。 每个“strl”列表都包含有关文件中一个流的信息,并且必须包含流标头区块 ('strh') 和流格式区块 ('strf') 。 此外,“strl”列表可能包含流标头数据区块 ('strd') 和流名称区块 ('strn') 。

流标头区块 ('strh') 由 AVISTREAMHEADER 结构组成。

流格式区块 ('strf') 必须遵循流标头区块。 流格式区块描述流中数据的格式。 此区块中包含的数据取决于流类型。 对于视频流,信息是 BITMAPINFO 结构,包括调色板信息(如果适用)。 对于音频流,信息是 一个 WAVEFORMATEX 结构。

如果存在 ('strd') 区块的流标头数据,则它遵循流格式区块。 此区块的格式和内容由编解码器驱动程序定义。 通常,驱动程序使用此信息进行配置。 读取和写入 AVI 文件的应用程序不需要解释此信息;它们将它作为内存块轻松传输到驱动程序和从驱动程序传输。

可选的“strn”区块包含描述流的以 null 结尾的文本字符串。

根据“strl”区块的顺序,“hdrl”列表中的流标头与“movi”列表中的流数据相关联。 第一个“strl”区块适用于流 0,第二个区块适用于流 1,依此类推。

流数据 (“movi”列表)

在标头信息之后是一个包含流中实际数据的“movi”列表,即视频帧和音频示例。 数据区块可以直接驻留在“movi”列表中,也可以分组到“rec”列表中。 “rec”分组意味着分组区块应一次性从磁盘中读取,并且适用于交错以从 CD-ROM 播放的文件。

标识每个数据区块的 FOURCC 由一个两位数的流编号组成,后跟一个定义区块中信息类型的双字符代码。

双字符代码 说明
db 未压缩的视频帧
dc 压缩视频帧
pc 调色板更改
工 务 局 音频数据

 

例如,如果流 0 包含音频,则该流的数据区块将具有 FOURCC“00wb”。 如果流 1 包含视频,则该流的数据区块将具有 FOURCC“01db”或“01dc”。 视频数据块还可以定义新的调色板条目,以在 AVI 序列期间更新调色板。 每个调色板更改区块 ('xxpc') 都包含 一个 AVIPALCHANGE 结构。 如果流包含调色板更改,请在该流的 AVISTREAMHEADER 结构的 dwFlags 成员中设置AVISF_VIDEO_PALCHANGES标志。

文本流可以使用任意的双字符代码。

AVI 索引条目

AVI 1.0 索引

可选的索引 (“idx1”) 块可以遵循“movi”列表。 索引包含数据区块及其在 文件中的位置的列表。 它由 AVIOLDINDEX 结构组成,其中包含每个数据区块(包括“rec”区块)的条目。 如果文件包含索引,请在 AVIMAINHEADER 结构的 dwFlags 成员中设置AVIF_HASINDEX标志。

AVI 2.0 索引

AVI 2.0 索引可以显示为单个区块。 或者,可以在“movi”区块中交错索引段。 如果索引段放置在“movi”区块中,则超级索引包含索引段的索引。 AVIMETAINDEX 结构是索引段和超级索引的基本结构。 有关详细信息,请参阅 OpenDML AVI M-JPEG 文件格式小组委员会发布的 OpenDML AVI 文件格式扩展。 (此资源可能在某些语言和国家/地区不可用。)

其他数据区块

可以通过根据需要插入“垃圾邮件”区块,在 AVI 文件中对齐数据。 应用程序应忽略“垃圾邮件”区块的内容。

AVI 文件格式