必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-07-18 05:12:10来源:IT技术作者:seo实验室小编阅读:54次「手机版」
 

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,可以是一个对象或者返回一个对象的函数,该对象包含了各

navicat连接mysql8错误1130方案解决

安装MySQL8.0发现用navicat 连接不上MySQL了,大概原因是mysql的root用户的验证方式变了。可以从图下看出root的用户的加密方式为ca

Octavia 的实现与分析(OpenStack Rocky)

目录 文章目录目录Octavia基本对象概念基本使用流程软件架构服务进程清单代码结构loadbalancer 创建流程分析network_tasks.Alloc

Navicat Premium

一、简介。 Navicat Premium 是一套数据库开发工具,让你从单一应用程序中同时连接 MySQL、MariaDB、SQL Server、Oracle、PostgreS

opencv实例三:播放AVI格式视频

一、不带滚动条的视频读取播放。 1、原理介绍:视频的本质是一些静态的图像的集合,opencv可以不断读取视屏中的图片,显示,就可以实时的

分享到:

栏目导航

推荐阅读

热门阅读