微软的 AVI 文件格式是一种用于捕获、编辑和回放 audio-video 序列的 RIFF 文件规范。总体上讲,AVI 文件包含多个针对不同数据的流。 大部分 AVI 序列使用 audio 和 video 流。 一个简单的 AVI序列特例可以只包含 video 数据而不包含 audio 数据。

本部分并没有介绍 OpenDML 对于 AVI 文件格式的扩展。如果要对其深入研究, 请参考 OpenDML AVI M-JPEG 文件格式小组委员会出版的《OpenDML AVI File Format Extensions 》。

FOURCCs

一个 FOURCC( four-character code,4字符码)是一个包含4个ASCII码字符串的32位的无符号整型数据。例如, 在 Little-Endian 系统中, FOURCC 'abcd' 表示为 0x64636261。FOURCC中也可以包含空格,如 ' abc' 也是一个有效的FOURCC。 AVI 文件使用 FOURCC码标示流的类型、数据chunk、index元素, 和其他的信息。

RIFF 文件格式

AVI 文件格式是基于 RIFF ( resource interchange file format ) 文档格式的。一个 RIFF 文件包含一个RIFF 头, 以及其后的多个 list 和 chunk。

(1)RIFF 头的格式:

‘RIFF’+文件大小+文件类型+(数据)

'RIFF'就是FOURCC码'RIFF'。文件大小是一个表示文件中数据大小的4字节值。文件类型是一个FOURCC码,表示文件类型。文件大小,包含的是文件类型以及其后数据的大小,不包含FOURCC码'RIFF'和文件大小本身所占的空间。

(2)块(chunk)的格式:

ckID+ckSize+ckData

其中, ckID是一个说明该chunk中所包含的数据的FOURCC码。szSize 是表示 ckData 中数据大小的4字节数值。ckData是0个或多个字节的数据。数据总是填充到就近的WORD边界。ckSize表示的是chunk中有效数据的大小,它不包括填充部分的大小,以及ckID和ckSize所占的空间。

(3)List 格式:

'LIST'+listSize+listType+listData

'LIST'就是FOURCC码'LIST'。listSize是表示list大小的4字节数值。listType是一个FOURCC码。listData中是以任意顺序排列的多个list和chunk。listSize包含的是listType和listData的大小,而不包含FOURCC码'LIST'和文件大小本身所占的空间。

本文的余下内容,将用以下符号表示 RIFF chunk:

ckID ( ckData )。

其中chunk大小的概念比较模糊。使用以上符号,一个list可以表示为:

'LIST' ( listType ( listData ) )。

可选成员被放到了方括号中:[可选成员]

AVI RIFF Form

AVI 文件在 RIFF 头中用 FOURCC 码'AVI '标示。所有的AVI文件都被强制要求包含两个LIST 类型的chunk,分别定义了stream的格式和stream的数据。一个AVI文件还可能包含一个index chunk,其中包含了数据chunk在文件中的位置。包含以上部分的AVI文件的格式为:

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

'hdrl' list定义了数据的格式,是第一个必须的LIST chunk。'movi' list包含了AVI序列中的数据,是第二个必须的LIST chunk。'idx1'list包含了index数据。这三部分在AVI文件中的顺序是特定的。

注意:OpenDML 扩展中定义了另外一种index,用FOURCC码'indx'进行标示。

'hdrl' list和'movi' list 用subchunk来表示它们的数据。 下面的例子列出了AVI RIFF文件的结构, 其中的list需要包含相应的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 'SubChunk1SubChunk2...)...}...)['idx1' (<AVI Index>) ])

AVI Main Header

'hdrl' list的开头部分是一个包含主AVI header 的 'avih' chunk。主header中包含了AVI 文件的一些全局信息,如:文件中包含多少个流,AVI序列的宽高等等。主header chunk的内容可以用结构体 AVIMAINHEADER 表示。

AVI Stream Headers

主header 后面跟的是一个或多个'strl' list。每一个数据流都需要有一个'strl' list。每一个'strl' list都必须包含文件中一种流的信息,并且必须包含该流的header chunk('strh')和format chunk('strf')。另外,一个'strl' list还可能包含一个流的头数据chunk('strd')和一个流的名称chunk('strh')。

流的header chunk ('strh')可以用结构体 AVISTREAMHEADER 表示。

流的format chunk('strf')一定要跟在header chunk的后面。Format chunk描述了流中数据的格式。Format chunk中包含什么数据,依赖于流的类型。对于video流,其中的数据是一个BITMAPINFO结构体,如果指定的话其中将包含一个调色板。对于audio 流,其中的数据是一个WAVEFORMATEX 结构体。

如果包含流的header data chunk('strd'),它将紧随在流的format chunk('strf')之后。其格式已经包含的内容由codec driver来定义。通常情况下,drivers使用其中的数据作为配置信息。读或者写AVI文件的应用程序不需要解释这些信息,只需要作为一个内存块,传给driver,或者从driver处获取。

可选的'strn'chunk包含一个描述流的,以空字符为结尾的文本字符串。

'hdrl'list中流的头信息,按照其中'strl'chunk的顺序,与'movi'list中的流数据关联起来。其中,第一个'strl'chunk表示stream 0,第二个表示stream 1,以此类推。

Stream Data ( 'movi' list )

头信息的后面,是一个包含流的真实数据的'movi'list,这些数据包括视频帧、音频采样等。数据chunk 可以直接作为成员,存在于'movi'list中,也可以组成一个'rec 'list,整体作为一个成员,存在于'movi'list中。一个'rec 'list中包含的所有的chunk,应该一次从磁盘中读入到内存,这样是为了那些从磁盘交错播放的文件。

一个数据chunk的FOURCC码,前两个字节的数字信息,用来说明该chunk属于哪个流;后两个字节的字符信息,说明该chunk中数据的类型。

例如,如果stream 0 包含的是audio, 该流的data chunk将含有FOURCC码'00wb';stream 1包含的是video,该流的data chunk 将包含FOURCC码'01db'或者'01dc'。Video 的data chunk还可以在AVI序列中定义一个新的调色板条目。没一个 改变调色板(palette-change)的chunk( 'xxpc' )包含一个AVIPALCHANGE的结构体。如果一个流包含有调色板变更,该流的AVISTREAMHEADER结构体( strh )中的成员deFlags会被设置AVISF_VIDEO_PALCHANGES 标志。

文本流可以使用其他任意两个字符的编码。

AVI Index Entries

可选的index chunk('idx1')可以跟在'movi'list的后面。index包含了一个数据chunk和它们在文件中位置的列表(list)。它包含一个AVIOLDINDEX结构体,其中有针对每个数据chunk的条目,也包括'rec 'chunk。如果文件包含了index,AVIMAINHEADER结构体( 'avih' )中的成员dwFlags需要被设置AVIF_HASINDEX 标志。

Other Data Chunks

如果需要,可以在数据中插入'JUNK'chunk。应用程序应该忽略'JUNK'chunk所包含的内容。

参考地址:http://www.cnblogs.com/andriod-html5/archive/2010/06/19/2539618.html

英文原文地址:http://msdn.microsoft.com/en-us/library/ms779636.aspx

AVI文件格式之RIFF格式参考相关推荐

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

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

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

    这里介绍AVI会使用到的数据结构,为了避免翻译引入歧义,决定该部分还是使用英文原文,如后续有时间再进行翻译. AVIMAINHEADER structure The AVIMAINHEADER str ...

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

    拖了很久的AVI音视频封装实例,花了一天时间终于调完了,兼容性不是太好,但作为参考学习使用应该没有问题.RIFF和AVI以及WAV格式,可以参考前面的一些文章.这里详细介绍将一个H264视频流和一个2 ...

  4. 【数据压缩】WAV文件和AVI文件格式分析

    一.WAV文件和AVI文件格式简介 WAV的英文全称是Waveform Audio File Format ,它采用 RIFF (Resource Interchange File Format)文件 ...

  5. AVI 文件格式解析

    AVI 文件格式解析 前言 AVI(Audio Video Interleaved 音频视频交错格式)是一种音视频的封装格式,于1992年由微软公司推出.它用RIFF(Resource Interch ...

  6. AVI文件格式解析+AVI文件解析工具

    (转)AVI文件格式解析+AVI文件解析工具 AVI文件解析工具下载地址:http://download.csdn.net/detail/zjq634359531/7556659 AVI(Audio ...

  7. AVI音视频封装格式学习(五)——h265与PCM合成AVI文件

    不知道是处于版权收费问题还是什么原因,H265现在也并没有非常广泛的被普及.将h265数据合成AVI的资料现在在网上也基本上没有.使用格式化工厂工具将h265数据封装成AVI格式,发现它在封装的时候其 ...

  8. AVI文件格式简介与WAV文件分析

    AVI文件格式简介与WAV文件分析 AVI文件格式(回答问题) 所有AVI文件至少包含2个必须的LIST Chunk和一个索引Chunk Chunk: LIST Chunk: 小端:数据的低位保存在内 ...

  9. 第三周 AVI文件格式解析

    一.AVI文件简介   AVI英文全称为Audio Video Interleaved,Audio/Video Interleaved(视音频交织),用于采集.编辑.播放的RIFF文件,由信息块,数据 ...

最新文章

  1. android.mk-编译文件学习(转载)
  2. 《java多线程编程实战指南 核心篇》读书笔记二
  3. 数据库——MongoDB增删改查
  4. 1. 各种虚拟机的发展历史
  5. 怎样在PropertySheet中添加按钮
  6. linspace函数matlab_从零开始的matlab学习笔记——(29)泰勒逼近函数
  7. DragDrop 注册失败的解决方法 转
  8. winform 的exe为什么移动之后不能使用_C++MyDock配置要求、所需运行库、常见问题 初次使用必看...
  9. Android音频系统之AudioFlinger(一)
  10. iis启动服务时提示在本地计算机 无法启动iis admin服务,iis 依存服务和组没法启动...
  11. 关于基向量的理解和矩阵的推导
  12. 【Datawhale第25期组队学习】Task01:异常检测概念和方法
  13. 使用 Nginx 实现 URL 的重定向
  14. python里的百分号_python中的百分号
  15. WordPress | QQ互联授权登录
  16. 点击微信内网页a标签直接跳转打开淘宝APP的方法实例
  17. 游戏制作之路(25)Camera(摄像机)的清除标志Solid color
  18. 视频号容易被限流的8个雷区,这些规则你一定要知道!
  19. MSF Project Management Discipline
  20. 城市级智慧水务多系统解决方案

热门文章

  1. 这24款效率办公神器,挺强的~
  2. quotename mysql_在MySQL中将行记录转换为列
  3. DB9和DB25的常用信号脚说明;RS232接口针脚定义
  4. 【调剂】东北石油大学计算机科学与技术专业接收调剂考生
  5. vmware windows 挂载扩展硬盘 + 共享文件夹
  6. 根据XML自动生成XSD
  7. R入门(九)--- 地图
  8. 如何提升亚马逊产品的溢价能力?
  9. 商号是知识产权客体吗
  10. 安卓子view的前后关系,z轴效果更改的一些思路