AVI RIFF 文件参考

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

本部分不介绍 OpenDML AVI 文件格式扩展。 有关这些扩展的详细信息,请参阅 OpenDML AVI 文件格式扩展,该扩展由 OpenDML AVI M-JPEG 文件格式小组委员会发布。

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”,是一个 4 字节值, fileSize 提供文件中数据的大小,是 fileType 一个用于标识特定文件类型的 FOURCC。 fileSize值包括 FOURCC 的大小fileType加上以下数据的大小,但不包括“RIFF”FOURCC 的大小或大小fileSize。 文件数据按任意顺序由区块和列表组成。

  • 区块具有以下形式:

    ckID ckSize ckData

    其中 ckID ,一个用于标识区块中包含的数据的 FOURCC,是一个 4 字节值, ckSize 它提供数据的大小 ckData,并且 ckData 是零个或多个数据字节。 数据始终填充到最近的 WORD 边界。 ckSize 提供区块中有效数据的大小;它不包括填充、大小 ckID或大小 ckSize

  • 列表具有以下形式:

    'LIST' listSize listType listData

    其中,“LIST”是文本 FOURCC 代码“LIST”,是一个 4 字节值, listSize 提供列表的大小, listType 是一个 FOURCC 代码,由 listData 区块或列表组成,按任意顺序排列。 包含大小加上大小listData的值listSizelistType;它不包括“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 结构,包括调色板信息(如果合适)。 对于音频流,信息是 波形图X 结构。

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

可选的“strn”区块包含描述流的空终止文本字符串。

“hdrl”列表中的流标头根据“strl”区块的顺序与“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 结构。 如果流包含调色板更改,请将该流的 dwFlags 成员中的AVISF_VIDEO_PALCHANGES标志设置为该流的 AVISTREAMHEADER 结构。

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

AVI 索引条目

AVI 1.0 索引

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

AVI 2.0 索引

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

其他数据区块

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

AVI 文件格式