avi格式
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
相关阅读
React Navigation 基础 5 : 配置导航头部
配置导航头部 设置头部标题 屏幕组件可以有一个静态属性navigationOptions,可以是一个对象或者返回一个对象的函数,该对象包含了各
安装MySQL8.0发现用navicat 连接不上MySQL了,大概原因是mysql的root用户的验证方式变了。可以从图下看出root的用户的加密方式为ca
Octavia 的实现与分析(OpenStack Rocky)
目录 文章目录目录Octavia基本对象概念基本使用流程软件架构服务进程清单代码结构loadbalancer 创建流程分析network_tasks.Alloc
一、简介。 Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、SQL Server、Oracle、PostgreS
一、不带滚动条的视频读取播放。 1、原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的