AVI音视频封装格式学习(二)——AVI RIFF文件参考

AVI RIFF文件参考 AVI RIFF File Reference

    微软AVI文件格式是与捕获,编辑和播放音视频流的应用程序一起使用的RIFF文件规范。通常,AVI文件包含多个不同类型的数据流。大多数AVI文件同时使用音频和视频流。简单的AVI文件只包含视频数据,不包含音频数据。

    本节不描述AVI的扩展格式(OpenDML AVI file format extensions),有关这些扩展的更多信息,请查看由OpenDML AVI M-JPEG文件格式小组委员会发布的《OpenDML AVI File Format Extensions

FOURCCs

    FOURCC(四字符代码)是通过连接四个ASCII字符创建的一个32位无符号整数。例如,FOURCC值为'abcd',在小端系统上表示为0x64636261。FOURCC可以包含空格字符,所以' abc'是一个有效的FOURCC(注意a前面有个空格),AVI文件格式使用FOURCC代码来标识流类型,数据块,索引项和其他信息。

RIFF文件格式(RIFF File Format)

    AVI文件格式基于RIFF(资源交换文件格式)文件格式.每个个RIFF文件都包含一个RIFF头(RIFF header ),后面可以跟任意个块(chunk)和表(list)。

RIFF header有下面的格式:
    'RIFF' fileSize fileType(data)

    其中'RIFF'是字面上的FOURCC代码'RIFF',fileSize是一个4字节的值,用于指定文件中数据的大小。fileType是一个识别特定文件类型的FOURCC.fileSize 值得大小等于fileType大小加上后面数据(data)的大小,但是不包含‘RIFF’ 和 fileSize 占用的大小。 文件数据可以包含块(chunk)和表(list),它们可以以任意的顺序存放。

块(chunk)的格式
    ckID ckSize ckData

    其中ckID是一个FOURCC,用于标识块中包含的数据,ckSize是一个4字节的值,用于表示ckData中的数据大小,而ckData任意多个字节的数据(最大4G)。这些数据都是以4字节对齐的,ckSize的值是ckData中有效数据的大小,不包括填充的数据,也不包括ckID和ckSize占用的空间(它们两各占用4字节)。

表(list)的格式
    'LIST' listSize listType listData

    其中'LIST'是字面上的FOURCC代码'LIST‘,listSize占用4个字节表示list的大小,listType是一个FOURCC代码,listData包含块(chunk)和表(list),它们可以以任意顺序存放。listSize的大小包括listType占用的空间(4字节)加上listData的实际长度,但是不包含字符’LIST‘(4字节)和listSize(4字节)的大小。

说明

本节的其余部分使用以下表示法来描述RIFF块:
    ckID ( ckData )
块大小是隐含的。 使用这种表示法,列表可以表示为:
    'LIST' ( listType ( listData ) )

可选元素放在括号中:[可选元素]

AVI RIFF Form

    AVI文件由RIFF头(header)中的FOURCC'AVI'标识。所有的AVI文件必须包含两个表(list),一个表(list)用来定义数据流的格式,一个表(list)用来存放数据流的数据。一个AVI文件可能还包含一个索引表,用来描述数据块(data chunck)在文件中的位置。包含这些部分的AVI文件具有以下格式:

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

    'hdrl'列表是第一需要的LIST块,它定义了数据的格式。'movi'是第二个LIST块,它包含AVI数据流中的数据。idx1表包含索引。AVI文件必须保证这三个部分的正确顺序。

注意:OpenDML extensions 定义了另外的一种索引,它FOURCC的值为'indx'

    'hdrl'和'movi'列表使用子块来处理他们的数据,下面这个例子展示了用来完善这些表(list)的AVI RIFF 扩展块(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

    'avih'是hsrl列表的开始,主AVI头(Main AVI Header)包含在'avih'中。Main AVI Header 中包含整个AVI文件的全局信息,比如流媒体的个数以及AVI中视频的分辨率(宽度和高度)。头块( main header chunk)包含一个结构体 AVIMAINHEADER 

AVI Stream Headers

    主头结构(main header.)可以有一个或是多个'strl'列表,每个数据流都需要有'strl'列表与它对应。每个'strl'列表包含文件中一个流的信息,并且必须包含一个流头部块('strh')和一个流格式块('strf')另外,'strl'列表可能包含一个流标题数据块('strd')和一个流名称块('strn')。

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

    流格式块('strf')必须跟在流头部块('strh')的后面,流格式块描述流中数据的格式。包含在该块中的数据取决于流类型,对于视频流,'strf'的信息是一个BITMAPINFO结构,包括调色板信息(如果适用)。对于音频流,'strf'的信息是WAVEFORMATEX结构。

    如果流头数据('strd')块存在,它应该跟在流格式块('strf')的后面,该块的格式和内容由编解码器驱动程序定义。通常,驱动程序使用此信息进行配置。读取和写入AVI文件的应用程序不需要解释'strd'里的信息,他们简单地将它作为内存块与驱动程序进行传输。

    可选的'strn'块包含描述流的以空字符结尾的文本字符串

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

Stream Data ('movi' List)

    跟在头信息(hdrl 列表)后面的是'movi'列表,'movi'列表包含数据流中的真实数据——视频帧和音频样本。数据块可以直接驻留在'movi'列表中,或者可以将它们归入'rec'列表中。'rec'分组意味着应该一次从磁盘读取分组块,适用于交错式从CD-ROM播放的文件。

  识别每个数据块的FOURCC包含一个两位数字的媒体流号,后跟一个定义该块中信息类型的两字符代码。

Two-character codeDescription
dbUncompressed video frame
dcCompressed video frame
pcPalette change
wbAudio data

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

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

AVI Index Entries

AVI 1.0 index

    在'movi'列表的后面可以有一个索引('idx1')块。索引包含数据块的列表(list)及其在文件中的位置。它由一个AVIOLDINDEX结构和每个数据块的条目组成,包括'rec'块.如果文件包含索引,请在AVIMAINHEADER结构的dwFlags成员中设置AVIF_HASINDEX标志。

AVI 2.0 index

    AVI 2.0索引可以显示为一个单独的块,或者,索引段可以在'movi'块内交错.AVIMETAINDEX结构是索引段和超级索引的基础结构.有关2.0索引的更多信息,可以参考由OpenDML AVI M-JPEG问价格式委员会发布的《 OpenDML AVI File Format Extensions》

Other Data Chunks

    为了AVI文件数据的对齐,可以根据需要插入'JUNK'块。应用程序应该忽略“JUNK”块的内容。

名字解析:

FOURCC: four-character code. a 32-bit unsigned integer created by concatenating four ASCII characters.

hdrl: The first sub-chunk is identified by the "hdrl" tag. This sub-chunk is the file header and contains metadata about the video, such as its width, height and frame rate. 

movi:The second sub-chunk is identified by the "movi" tag. This chunk contains the actual audio/visual data that make up the AVI movie

idx1:The third optional sub-chunk is identified by the "idx1" tag which indexes the offsets of the data chunks within the file.

strh: stream header chunk

strn: stream name chunk 

strf: stream format chunk

strd: stream-header data 

      

 计划该系列文章包括下面几篇:

           AVI音视频封装格式学习(一)——微软RIFF文件格式摘要

           AVI音视频封装格式学习(二)——AVI RIFF文件参考

           AVI音视频封装格式学习(三)——AVI 数据结构解析

           AVI音视频封装格式学习(四)——linux系统C语言AVI格式音视频封装应用

                            

                                                                                                                  Wen Lee

                                                                                                                 2018.04.01 

  由于各种原因,后续文章内容将更新到公众号,本平台将不再做更新。

CSDN上相关文章的测试工程代码,也统一放到了公众号上,可以免费免积分下载

有需要的可以扫下面二维码转到公众号,欢迎关注,欢迎提出您宝贵的意见和建议!

liwen01 2022.08.21

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值