概述
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 code | Description |
db | Uncompressed video frame |
dc | Compressed video frame |
pc | Palette change |
wb | Audio 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
最后
以上就是温婉鲜花为你收集整理的AVI音视频封装格式学习(二)——AVI RIFF文件参考FOURCCsRIFF文件格式(RIFF File Format)AVI RIFF FormAVI Main HeaderAVI Stream HeadersStream Data ('movi' List)AVI Index EntriesOther Data Chunks名字解析:的全部内容,希望文章能够帮你解决AVI音视频封装格式学习(二)——AVI RIFF文件参考FOURCCsRIFF文件格式(RIFF File Format)AVI RIFF FormAVI Main HeaderAVI Stream HeadersStream Data ('movi' List)AVI Index EntriesOther Data Chunks名字解析:所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复