收藏 分享(赏)

riff%20文件规范和avi文件规范doc.doc

上传人:杨桃文库 文档编号:3765712 上传时间:2018-11-18 格式:DOC 页数:13 大小:144.50KB
下载 相关 举报
riff%20文件规范和avi文件规范doc.doc_第1页
第1页 / 共13页
riff%20文件规范和avi文件规范doc.doc_第2页
第2页 / 共13页
riff%20文件规范和avi文件规范doc.doc_第3页
第3页 / 共13页
riff%20文件规范和avi文件规范doc.doc_第4页
第4页 / 共13页
riff%20文件规范和avi文件规范doc.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、RIFF 文件规范Peter Lee 2007-10-02摘要:RIFF 全称为资源互换文件格式(Resources Interchange File Format),RIFF 文件是 windows 环境下大部分多媒体文件遵循的一种文件结构,常见的如 WAV 文件、AVI 文件等。RIFF 可以看成一种树状结构,其基本组成单元为 LIST 和 CHUNK,分别如树的节点和叶子。一、RIFF 文件简介RIFF 是 Microsoft 提出的一种多媒体文件的存储方式,不同编码的音频、视频文件,可以按照它定义的存储规则保存、记录各自不同的数据,如:数据内容、采集信息、显示尺寸、编码方式等。在播放器

2、或者其它提取工具读取文件的时候,就可以根据 RIFF 的规则来分析文件,合理的解析出音频、视频信息,正确进行播放。常见的 RIFF 文件有 WAV 文件和 AVI 文件,它们都是遵循 RIFF 格式保存播放信息和播放数据的。二、RIFF 文件的组织结构在 RIFF 的文件存储规则中,主要有几个重要的概念需要理解,它们是 FOURCC, CHUNK, LIST。下面会对这几个概念进行详细解释。RIFF 格式是一种树状的结构,其基本组成单元为 LIST 和 CHUNK,分别如树的节点和叶子。RIFF 格式也类似 windows 文件系统的组织形式,windows 文件系统有目录和文件,分别对应 R

3、IFF 中的 LIST 和 CHUNK。Windows 文件系统中的目录可以包含子目录和文件,而文件是保存数据的基本单元,RIFF 也使用了这样的结构。在 RIFF 文件中,数据保存的基本单元是 CHUNK,可用于保存音视频数据或者一些参数信息, LIST 相当于文件系统的目录,可以包含多个 CHUNK 或者多个 LIST。1、 FOURCC一个 FOURCC(four character code)是一个占 4 个字节的数据,一般表示 4 个 ASCII 字符。在 RIFF 文件格式中,FOURCC 非常普遍,LISTtype, chunkid, 起始标识等信息都是用FOURCC 表示的。

4、FOURCC 一般是四个字符,如”abcd” 这样的形式,也可以三个字符包含一个空格,如”abc ”这样的形式。2、 CHUNK一个 CHUNK 数据块的数据结构如下:ChunkID ChunkSize ChunkDataChunkID 是一个 FOURCC,标识该 CHUNK 的名称,类似于 windows 文件系统中的文件名。ChunkSize 占用 4 个字节,表示 ChunkData 部分的数据内容大小,以字节为单位。ChunkData 则是 CHUNK 中实质性的内容,保存的是 CHUNK 的具体数据内容。一个CHUNK 保存的数据可以是关于声音文件的编码方式、音视频采样等信息,也可

5、以是音频或视频数据。具体表示是哪类数据则通过 ChunkID 来标识。3、 LIST一个 LIST 数据块的数据结构如下:“LIST” ListSize ListType ListData“LIST”也是一个 FOURCC,而且是固定的,每个 LIST 都是以“LIST”为开头。ListSize 占用4 个字节,表示 ListType 和 ListData 两部分加在一起的大小。 ListType 是一个 FOURCC,是对 LIST 具体包含的数据内容的标识。而 ListData 则是该 LIST 的数据内容区,有 CHUNK和子 LIST 组成,它们的个数和组成次序可以是不确定的。4、 R

6、IFF 文件头RIFF 文件头的数据结构如下:“RIFF” FileSize FileType FileData“RIFF”也是一个 FOURCC,用于标识该文件是一个 RIFF 格式的文件。FileSize 是一个 4 字节的数据,给出文件的大小,但仅包括 FileType 和 FileData 两部分。FileType 是一个FOURCC,用来说明文件类型,如”WAV”, “AVI”等。FileData 部分表示文件的具体内容,可以是 LIST 也可以是 CHUNK.三、RIFF 文件举例WAV 文件WAV 是 waveform(波形)的所写,该声音文件是一个典型的按照 RIFF 规则组织

7、的文件。一般,在一个 WAV 文档中,主要用到 RIFF 文件头和 CHUNK 块两个概念。图 1 所示为 windows自带录音器所录制一段 WAV 语音文件的结构图。这个文件主要由三个 CHUNK 组成,它们的名称分别是:”fmt”,”fact 和”data” ,前两个 CHUNK 包含的是编码、回放等信息,”data”CHUNK 包含的是语音数据。图 1 WAV 示例文件结构图四、RIFF 解析器RIFFspotRIFFspot 用树方式直观展现 wav,avi 等 RIFF 文件的结构信息,图 2 为 RIFFspot 截图。图 2 RIFFspot 截图AVI 文件规范PeterLe

8、e 2007-10-14一、AVI 文件简介AVI 的英文全称为 Audio Video Interleaved,即音频视频交错格式,是将语音和影像同步组合在一起的文件格式。AVI 于 1992 年被 Microsoft 公司推出,随 Windows3.1 一起被人们所认识和熟知。AVI 文件格式多用于音视频捕捉、编辑、回放等应用程序中。通常情况下,一个 AVI 文件可以包含多个不同类型的媒体流(典型的情况下有一个音频流和一个视频流),不过含有单一音频流或单一视频流的 AVI 文件也是合法的。AVI 可以算是 Windows 操作系统上最基本的、也是最常用的一种媒体文件格式。Note: 本文介

9、绍的是基本的 AVI 文件格式规范,至于 newAVI 等一些 AVI 扩展格式,请关注笔者后续文章。二、RIFF 文件规范AVI 文件属于一种 RIFF( Resource Interchange File Format 的缩写)文件格式,与此同类的还有常见的 WAV 文件。RIFF 是 Microsoft 提出的一种多媒体文件的存储方式,不同编码的音频、视频文件,可以按照它定义的存储规则保存、记录各自不同的数据。如果读者不熟悉 RIFF 文件规范,阅读下面章节前,建议先阅读RIFF 文件规范 这篇文章:http:/ 三、AVI 文件结构实例分析1、AVI 文件结构示例图 1 所示为 win

10、dows 系统目录下的 clock.avi 的文件结构图,其结构是用RIFFspot 程序解析得到的,关于 RIFFspot 程序,感兴趣的读者可以到下面的网址中下载:http:/ 图 1 clock.avi 文件结构2、AVI 文件全局结构说明如图 1 所示,整个 AVI 文件的结构为:一个 RIFF 头 + 两个列表(一个用于描述媒体流格式、一个用于保存媒体流数据) + 一个可选的索引块 + 一个JUNK 块。首先,RIFF ( AVI )表征了 AVI 文件类型。然后就是 AVI 文件必需的第一个列表hdrl列表,用于描述 AVI 文件中各个流的格式信息( AVI文件中的每一路媒体数据都

11、称为一个流)。hdrl 列表嵌套了一系列块和子列表首先是一个avih块,用于记录 AVI 文件的全局信息。然后,就是一个或多个strl子列表。文件中有多少个流,这里就对应有多少个 strl子列表,示例 clock.avi 文件有两路流,既音频流和视频流。当 AVI 文件中的所有流都使用一个strl子列表说明了以后(注意:strl子列表出现的顺序与媒体流的编号是对应的,比如第一个 strl子列表说明的是第一个流(Stream 0),第二个strl子列表说明的是第二个流(Stream 1),以此类推),hdrl列表的任务也就完成了,随后跟着的就是AVI 文件必需的第二个列表movi列表,用于保存真

12、正的媒体流数据(视频图像帧数据或音频采样数据等)。最后,紧跟在hdrl列表和 movi列表之后的,就是 AVI 文件可选的索引块。这个索引块为 AVI 文件中每一个媒体数据块进行索引,并且记录它们在文件中的偏移(可能相对于movi列表,也可能相对于 AVI 文件开头)。图 1 中还有一种特殊的数据块,用一个四字符码JUNK来表征,它用于内部数据的队齐(填充),应用程序应该忽略这些数据块的实际意义。3、avih块avih块,用于记录 AVI 文件的全局信息,比如流的数量、视频图像的宽和高等,可以使用一个 AVIMAINHEADER 数据结构来操作: typedef struct _avimain

13、header FOURCC fcc; / 必须为avihDWORD cb; / 本数据结构的大小,不包括最初的 8 个字节(fcc 和 cb 两个域)DWORD dwMicroSecPerFrame; / 视频帧间隔时间(以毫秒为单位)DWORD dwMaxBytesPerSec; / 这个 AVI 文件的最大数据率DWORD dwPaddingGranularity; / 数据填充的粒度DWORD dwFlags; / AVI 文件的全局标记,比如是否含有索引块等DWORD dwTotalFrames; / 总帧数DWORD dwInitialFrames; / 为交互格式指定初始帧数(非交

14、互格式应该指定为 0)DWORD dwStreams; / 本文件包含的流的个数DWORD dwSuggestedBufferSize; / 建议读取本文件的缓存大小(应能容纳最大的块)DWORD dwWidth; / 视频图像的宽(以像素为单位)DWORD dwHeight; / 视频图像的高(以像素为单位)DWORD dwReserved4; / 保留 AVIMAINHEADER;4、strl子列表每个strl子列表至少包含一个strh块和一个 strf块,而strd块(保存编解码器需要的一些配置信息)和strn块(保存流的名字)是可选的。首先是strh块,用于说明这个流的头信息,可以使用

15、一个AVISTREAMHEADER 数据结构来操作: typedef struct _avistreamheader FOURCC fcc; / 必须为strhDWORD cb; / 本数据结构的大小,不包括最初的 8 个字节(fcc 和 cb 两个域)FOURCC fccType; / 流的类型:auds(音频流)、vids(视频流)、/mids(MIDI 流)、txts(文字流)FOURCC fccHandler; / 指定流的处理者,对于音视频来说就是解码器DWORD dwFlags; / 标记:是否允许这个流输出?调色板是否变化?WORD wPriority; / 流的优先级(当有多个

16、相同类型的流时优先级最高的为默认流)WORD wLanguage;DWORD dwInitialFrames; / 为交互格式指定初始帧数DWORD dwScale; / 这个流使用的时间尺度DWORD dwRate;DWORD dwStart; / 流的开始时间DWORD dwLength; / 流的长度(单位与 dwScale 和 dwRate 的定义有关)DWORD dwSuggestedBufferSize; / 读取这个流数据建议使用的缓存大小DWORD dwQuality; / 流数据的质量指标(0 10,000)DWORD dwSampleSize; / Sample 的大小st

17、ruct short int left;short int top;short int right;short int bottom; rcFrame; / 指定这个流(视频流或文字流)在视频主窗口中的显示位置/ 视频主窗口由 AVIMAINHEADER 结构中的 dwWidth 和 dwHeight 决定 AVISTREAMHEADER;然后是strf 块,用于说明流的具体格式。如果是视频流,则使用一个BITMAPINFO 数据结构来描述;如果是音频流,则使用一个WAVEFORMATEX 数据结构来描述。5、movi列表movi列表保存的是真正的媒体流数据,其数据组织方式有两种。可以将数据块

18、直接嵌在movi 列表里面,也可以将几个数据块分组成一个rec 列表后再编排进movi 列表。当 AVI 文件中包含有多个流的时候,数据块与数据块之间如何来区别呢?数据块使用了一个四字符码来表征它的类型,这个四字符码由 2 个字节的类型码和 2 个字节的流编号组成。标准的类型码定义如下:db(非压缩视频帧)、dc(压缩视频帧)、 pc(改用新的调色板)、wb (音缩视频)。比如第一个流(Stream 0)是音频,则表征音频数据块的四字符码为 00wb;第二个流(Stream 1)是视频,则表征视频数据块的四字符码为 00db或00dc。对于视频数据来说,在 AVI 数据序列中间还可以定义一个新

19、的调色板,每个改变的调色板数据块用xxpc来表征,新的调色板使用一个数据结构 AVIPALCHANGE 来定义。(注意:如果一个流的调色板中途可能改变,则应在这个流格式的描述中,也就是 AVISTREAMHEADER 结构的 dwFlags 中包含一个 AVISF_VIDEO_PALCHANGES 标记)。另外,文字流数据块可以使用随意的类型码表征。6、AVI 索引块索引块使用一个四字符码idx1来表征,索引信息使用一个数据结构来 AVIOLDINDEX 定义。 typedef struct _avioldindex FOURCC fcc; / 必须为idx1DWORD cb; / 本数据结构

20、的大小,不包括最初的 8 个字节(fcc 和 cb 两个域)struct _avioldindex_entry DWORD dwChunkId; / 表征本数据块的四字符码DWORD dwFlags; / 说明本数据块是不是关键帧、是不是rec 列表等信息DWORD dwOffset; / 本数据块在文件中的偏移量DWORD dwSize; / 本数据块的大小 aIndex; / 这是一个数组!为每个媒体数据块都定义一个索引信息 AVIOLDINDEX;注意:如果一个 AVI 文件包含有索引块,则应在主 AVI 信息头的描述中,也就是 AVIMAINHEADER 结构的 dwFlags 中包含

21、一个 AVIF_HASINDEX 标记。四、后记大家应该都听过“AVI 文件不适合用于流媒体传输”这样的说法,通过本文对 AVI 文件结构的解析,相信大家对这种说法有更清晰的验证,因为 AVI 文件结构中置于文件尾部的索引块、头部信息中规定的文件长度等过多的选项都是不适合流媒体应用的。AVI 是音频视频交错(Audio Video Interleaved)的英文缩写,它是 Microsoft 公司开发的一种符合RIFF 文件规范的数字音频与视频文件格式,原先用于 Microsoft Video for Windows (简称 VFW)环境,现在已被 Windows 95/98、OS/2 等多数

22、操作系统直接支持。AVI 格式允许视频和音频交错在一起同步播放,支持 256 色和 RLE 压缩,但 AVI 文件并未限定压缩标准,因此,AVI 文件格式只是作为控制界面上的标准,不具有兼容性,用不同压缩算法生成的 AVI 文件,必须使用相应的解压缩算法才能播放出来。常用的 AVI 播放驱动程序,主要是 Microsoft Video for Windows 或 Windows 95/98 中的 Video 1,以及 Intel 公司的 Indeo Video。在介绍 AVI 文件前,我们要先来看看 RIFF 文件结构。AVI 文件采用的是 RIFF 文件结构方式,RIFF(Resource

23、Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows 环境中多媒体数据的文件格式,波形音频 wave,MIDI 和数字视频 AVI 都采用这种格式存储。构造 RIFF 文件的基本单元叫做数据块( Chunk) ,每个数据块包含 3 个部分,1、4 字节的数据块标记(或者叫做数据块的 ID)2、数据块的大小3、数据整个 RIFF 文件可以看成一个数据块,其数据块 ID 为 RIFF,称为 RIFF 块。一个 RIFF 文件中只允许存在一个 RIFF 块。RIFF 块中包含一系列的子块,其中有一种字块的 ID 为“LIST“,称为 LIST,

24、LIST块中可以再包含一系列的子块,但除了 LIST 块外的其他所有的子块都不能再包含子块。RIFF 和 LIST 块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下: 1、4 字节的数据块标记(Chunk ID)2、数据块的大小3、4 字节的形式类型或者列表类型4、数据下面我们看看 AVI 文件的结构。AVI 文件是目前使用的最复杂的 RIFF 文件,它能同时存储同步表现的音频视频数据。AVI 的 RIFF 块的形式类型是 AVI,它包含 3 个子块,如下所述:1、信息块,一个 ID 为“hdrl“的 LIST 块,定义 AVI

25、 文件的数据格式。2、数据块,一个 ID 为 “movi“的 LIST 块,包含 AVI 的音视频序列数据。3、索引块,ID 为 “idxl“的子块,定义 “movi“LIST 块的索引数据,是可选块。AVI 文件的结构如下图所示,下面将具体介绍 AVI 文件的各子块构造。1、信息块,信息块包含两个子块,即一个 ID 为 avih 的子块和一个 ID 为 strl 的 LIST 块。“avih“子块的内容可由如下的结构定义:typedef struct DWORD dwMicroSecPerFrame ; /显示每桢所需的时间 ns,定义 avi 的显示速率DWORD dwMaxBytesPe

26、rSec; / 最大的数据传输率DWORD dwPaddingGranularity; /记录块的长度需为此值的倍数,通常是 2048DWORD dwFlages; /AVI 文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储DWORD dwTotalFrame; /文件中的总桢数DWORD dwInitialFrames; /说明在开始播放前需要多少桢DWORD dwStreams; /文件中包含的数据流种类DWORD dwSuggestedBufferSize; /建议使用的缓冲区的大小,/通常为存储一桢图像以及同步声音所需要的数据之和DWORD dwWidth; /图像宽DWORD

27、 dwHeight; /图像高DWORD dwReserved4; /保留值MainAVIHeader;“strl“ LIST 块用于记录 AVI 数据流,每一种数据流都在该 LIST 块中占有 3 个子块,他们的 ID 分别是“strh“,“strf“, “strd“;“strh“子块由如下结构定义。typedef struct FOURCC fccType; /4 字节,表示数据流的种类 vids 表示视频数据流/auds 音频数据流FOURCC fccHandler;/4 字节 ,表示数据流解压缩的驱动程序代号DWORD dwFlags; /数据流属性WORD wPriority; /此

28、数据流的播放优先级WORD wLanguage; /音频的语言代号DWORD dwInitalFrames;/说明在开始播放前需要多少桢DWORD dwScale; /数据量,视频每桢的大小或者音频的采样大小DWORD dwRate; /dwScale /dwRate = 每秒的采样数DWORD dwStart; /数据流开始播放的位置,以 dwScale 为单位DWORD dwLength; /数据流的数据量,以 dwScale 为单位DWORD dwSuggestedBufferSize; /建议缓冲区的大小DWORD dwQuality; /解压缩质量参数,值越大,质量越好DWORD d

29、wSampleSize; /音频的采样大小RECT rcFrame; /视频图像所占的矩形AVIStreamHeader;“strf“子块紧跟在“strh“子块之后,其结构视“strh“ 子块的类型而定,如下所述;如果 strh 子块是视频数据流,则 strf 子块的内容是一个与 windows 设备无关位图的 BIMAPINFO 结构,如下:typedef struct tagBITMAPINFOBITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors1; /颜色表BITMAPINFO;typedef struct tagBITMAPINFOHEADERDWO

30、RD biSize;LONG biWidth;LONG biHeight;WORD biPlanes;WORD biBitCount;DWORD biCompression;DWORD biSizeImage;LONG biXPelsPerMeter;LONG biYPelsPerMeter;DWORD biClrUsed;DWORD biClrImportant;BITMAPINFOHEADER;如果 strh 子块是音频数据流,则 strf 子块的内容是一个 WAVEFORMAT 结构,如下:typedef struct WORD wFormatTag; WORD nChannels; /

31、声道数DWORD nSamplesPerSec; /采样率DWORD nAvgBytesPerSec; /WAVE 声音中每秒的数据量WORD nBlockAlign; /数据块的对齐标志WORD biSize; /此结构的大小WAVEFORMAT“strd“子块紧跟在 strf 子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。“strl“ LIST 块定义的 AVI 数据流依次将 “hdrl “ LIST 块中的数据流头结构与“movi“ LIST 块中的数据联系在一起,第一个数据流头结构用于数据流 0,第二个用于数据流 1,依次类推。数据块中存储视频和音频数据流,数据可

32、直接存于 “movi“ LIST 块中。数据块中音视频数据按不同的字块存放,其结构如下所述,音频字块“#wb“Wave 数据流视频子块中存储 DIB 数据,又分为压缩或者未压缩 DIB,“#db“RGB 数据流“#dc“压缩的图像数据流看到了吧,avi 文件的图像数据可以是压缩的,和非压缩格式的。对于压缩格式来说,也可采用不同的编码,也许你曾经遇到有些 avi 没法识别,就是因为编码方式不一样,如果没有相应的解码,你就没法识别视频数据。AVI 的编码方式有很多种,比较常见的有 mpeg2,mpeg4,divx 等。索引块,索引快包含数据块在文件中的位置索引,能提高 avi 文件的读写速度,其中存放着一组AVIINDEXENTRY 结构数据。如下,这个块并不是必需的,也许不存在。typedef struct DWORD ckid; /记录数据块中子块的标记DWORD dwFlags; /表示 chid 所指子块的属性DWORD dwChunkOffset; /子块的相对位置DWORD dwChunkLength; /子块长度;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 规章制度

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报