drag过去式和过去分词:AVI文件格式

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 19:27:59

AVI文件格式详解

AVI是音频视频交错(Audio VideoInterleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于MicrosoftVideo for Windows (简称VFW)环境,现在已被Windows95/98、OS/2等多数操作系统直接支持。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 InterchangeFileFormat,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分,

  1、4字节的数据块标记(或者叫做数据块的ID)

  2、数据块的大小

  3、数据

整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种字块的ID为"LIST",称为LIST,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文件的数据格式。

  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 dwMaxBytesPerSec; // 最大的数据传输率
 DWORD dwPaddingGranularity; //记录块的长度需为此值的倍数,通常是2048
 DWORD dwFlages; //AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储
 DWORD dwTotalFrame; //文件中的总桢数
 DWORD dwInitialFrames; //说明在开始播放前需要多少桢
 DWORD dwStreams; //文件中包含的数据流种类
 DWORD dwSuggestedBufferSize; //建议使用的缓冲区的大小,
 //通常为存储一桢图像以及同步声音所需要的数据之和
 DWORD dwWidth; //图像宽
 DWORD dwHeight; //图像高
 DWORD dwReserved[4]; //保留值
}MainAVIHeader;
dwMicroSecPerFrame

指定帧之间的微秒数。此值表明本文件的总时间。

dwMaxBytesPerSec

指定文件的近似最大数据速率。此值表明该系统每秒要处理的字节数,以表现一个AVI序列,正如在main header 和 stream header chunks 中其他参数指所指定的字节数。

dwPaddingGranularity

规定以字节为单位的数据对齐。将数据以该值的整数倍进行对齐。

dwFlags

包含0个 或多个一下标志的按位组合:

Value

Description

AVIF_COPYRIGHTED

表明AVI文 件包含了版权数据和软件。如果设置了改标志,将不允许软件对该数据进行拷贝。

AVIF_HASINDEX

表明AVI文 件包含一个index。

AVIF_ISINTERLEAVED

表明AVI文 件是交叉的。

AVIF_MUSTUSEINDEX

表明应用程序需要使用index,而不是物理上的顺序,来定义数据的展现顺序。例如,该标志可以用于创建一个编辑用的帧列表。

AVIF_WASCAPTUREFILE

表明该文件是一个用于捕获实时视频的,而特别分配的AVI 文 件。如果一个文件设置了该标志,在用户写该文件之前,应用程序应该发出警告,因为用户可能会对该文件进行碎片整理。


AVIF_COPYRIGHTED

0x00020000

AVIF_HASINDEX

0x00000010

AVIF_ISINTERLEAVED

0x00000100

AVIF_MUSTUSEINDEX

0x00000020

AVIF_WASCAPTUREFILE

0x00010000

TRUSTCKTYPE

0x00000800


dwTotalFrames

指定本文件中包含的帧数据的总数。也就是指定文件中总共包含多少帧。

dwInitialFrames

指定交错文件中的初始帧。非交错文件,该参数应该被设置为0。如果你正在创建一个交错文件,在该参数中指定文件中,AVI文件的初始帧之前,帧的数量,即文件中 在初始帧前面还有多少帧。

为了让音频驱动有足够的音频去处理,交错文件中的音频数据必须与视频数据有一定的偏移。通常情况下,音频数 据必须前移足够的帧,以使大约0.75秒的音频数据被预装。应该将音频数据中偏移的帧数设置到成员dwInitialRecords(未找到该成员,怀疑应该是dwInitialFrames)。 音频流header的结构体AVISTREAMHEADER的dwInitialFrames 成员,应该被设置为同样的值。

dwStreams

指定文件中包含的流的数量。例如,一个包含视频和音频数据的文件有两个流。

dwSuggestedBufferSize

指定读该文件用的建议的缓存大小。一般来说,该大小要足以包含文件中最大的数据块(chunk)。如果该成员被设置为0,或者太小,播放软件在播放时就需要重新 分配内容,这将导致性能的下降。对于一个交叉文件,该缓存大小应该足以读取一整条记录(在movi list中,有的数据以chunk的形式存在,有的数据以record即记录的形式存在,一个record 是多个chunk的组合),而不是一个chunk。

dwWidth

指定该AVI文 件的宽,以像素为单位。

dwHeight

指定该AVI文 件的高,以像素为单位。

dwReserved

保留,设置为0。


  "strl" LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh","strf", "strd";
"strh"子块由如下结构定义。

typedef struct
{
 FOURCC fccType; //4字节,表示数据流的种类 vids 表示视频数据流
 //auds 音频数据流
 FOURCC fccHandler;//4字节 ,表示数据流解压缩的驱动程序代号
 DWORD dwFlags; //数据流属性
 WORD wPriority; //此数据流的播放优先级
 WORD wLanguage; //音频的语言代号
 DWORD dwInitalFrames;//说明在开始播放前需要多少桢
 DWORD dwScale; //数据量,视频每桢的大小或者音频的采样大小
 DWORD dwRate; //dwScale /dwRate = 每秒的采样数
 DWORD dwStart; //数据流开始播放的位置,以dwScale为单位
 DWORD dwLength; //数据流的数据量,以dwScale为单位
 DWORD dwSuggestedBufferSize; //建议缓冲区的大小
 DWORD dwQuality; //解压缩质量参数,值越大,质量越好
 DWORD dwSampleSize; //音频的采样大小
 RECT rcFrame; //视频图像所占的矩形
}AVIStreamHeader;

fccType

包含一个标识流中数据类型的FOURCC码。针对视频和音频,标准的AVI值定义如下:

FOURCC

Description

'auds'

Audio stream

'mids'

MIDI stream

'txts'

Text stream

'vids'

Video stream


fccHandler

该成员是可选的,包含了一个FOURCC码,用于标识一个特定的数据处理程序。该数据处理程序是该流的首选数据处理程序。对于视频流和音 频流来说,这是一个解码流时用的编解码器。

dwFlags

包含数据流的所有标志。这些标志的高位序字,具体到流中包含的数据类型(意思应该是,这些标志的高位,说明了流的类 型)。标准标志定义如下:

AVISF_DISABLED

表明该流默认情况下不被启用。

AVISF_VIDEO_PALCHANGES

表明该流中包含调色板变换。该标志提示播放软件,它需要可变的调试板。


wPriority

指定一种流的优先级。例如,一个文件中包含了多个音频流,其中优先级最高的可能会是默认的流。

wLanguage

Language tag.

dwInitialFrames

指定在交叉文件中,音频流相对于视频流要向前偏移多少。通常情况下,是大约0.75秒。如果你正在创建交叉文件,在该成员中指定文件中,AVI序列的初始帧之前,帧的数量。详细信息, 请参考AVIMAINHEADER结构体中 dwInitialFrames 成员。

dwScale

与 dwRate 一起,决定该流 所要使用的时间尺度。用dwScale 去除dwRate ,得到一秒钟样本的数量。对于视频流,这就是帧率( fram rate )。对于音频流,这个频率相当于播放nBlockAlign 个字节的音频需要的时间,对于PCM音频,它只是采样率。

dwRate

参考dwScale.

dwStart

指定这个流开始的时间。其单位有主文件头中的dwRate dwScale 成 员定义(即其单位是dwRate/dwScale)。通常,dwStart0,但是它也可以为不与文件同时启动的流定义一个时间延迟。

dwLength

指定这个流的长度。单位由流的头信息中的dwRate dwScale 来 确定(即其单位是dwRate/dwScale)。(对于视频流,dwLength就是流包含的总 帧数;对于音频流,dwLength就是包含的block的数量,block是音频解码器能处理的原子单位)。dwLength/(dwRate/dwScale),即dwLength * dwScale / dwRate,可以得到流的总时长。

dwSuggestedBufferSize

指定读该流时需要的缓存的大小。通常情况下,这是一个与该流中最大的chunk的大小相对应的值。使用准确的缓存 大小,可以提高播放器的性能。如果你不知道准确的缓存大小,可以设置为0。

dwQuality

指定一个流数据的质量指标。该指标是一个0到10,000的 数值。对于压缩数据,这通常是一个作为质量参数值传给压缩软件的数值。如果该值为-1,驱动将使用默认的质量值。

dwSampleSize

指定 一个数据样本的大小。如果样本的大小可变,该成员将被设置为0。 如果该值为非0,该文件中的多个样本可以组成一个信号chunk。如果该值为0, 数据中的每个样本(例如,一个视频帧)必须放在一个单独的chunk中。对于视频流,该数值通常为0, 虽然当所有的视频帧都具有相同的大小时,它也可以为非0。对于音频流,该数值应该和结构体WAVEFORMATEX中的成员nBlockAlign一致。

rcFrame

指定一个在由AVI主头结构中的dwWidth 成 员和dwHeight 成员决定的电影矩形中,文本流或视频流的目标矩形。rcFrame 成 员通常用于支持多个视频流。将该矩形设置为与电影矩形对应的坐标,以更新整个电影矩形。该成员的单位是像素。目标矩形的左上角与电影矩形的左上角关联。

Remarks

该结构体的部分成员在结构体AVIMAINHEADER中也存在。AVIMAINHEADER中的数据是针对整个文件的,AVISTREAMHEADER中的数据是针 对单个流的。


  "strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构,如下:

typedef struct tagBITMAPINFO
{
 BITMAPINFOHEADER bmiHeader;
 RGBQUAD bmiColors[1]; //颜色表
}BITMAPINFO;

typedef struct tagBITMAPINFOHEADER
{
 DWORD biSize;
 LONG biWidth;
 LONG biHeight;
 WORD biPlanes;
 WORD biBitCount;
 DWORD biCompression;
 DWORD biSizeImage;
 LONG biXPelsPerMeter;
 LONG biYPelsPerMeter;
 DWORD biClrUsed;
 DWORD biClrImportant;
}BITMAPINFOHEADER;
bmiHeader
指定一个包含尺寸和颜色格式信息的位图信息头结构体。使用BITMAPINFOHEADER结构体。
bmiColors
包含下列之一:
  • 一个RGBQUAD结构体的数组。其成员构成颜 色表。
  • 一个指定当前实现了的逻辑调色板中 的索引的16位无符号整型。
    使用DIB的函 数允许使用bmiColors 的这种用法。如果bmiColors 包含了一个已实现的逻辑调色板的索引,它们必须调用如下的位图函数:CreateDIBPatternBrushPt和 CreateDIBSectionCreateDIBSection 函数的参数iUsage 必须被设置为DIB_PAL_COLORS 
    其中条目的个数依赖于BITMAPINFOHEADER 结 构体中的biBitCount biClrUsed成员。
    bmiColors 表中的颜色按重要性进行排列。详细信息,请参考:Remarks
  • 如果bmiHeader.biCompression 被 设置为了BI_RGB ,你可以将bmiColors 数组的大小设置为0

Remarks

一个设备无关的位图包含两个不同的部分:一个描述位图尺寸和颜色的BITMAPINFO结构体,和一个定义位 图像素的字节数组。数组中的数据排列在一起,但是必须用0将每个扫描行与LONG类型边界对齐。

如果位图的高是正数,则该位图是一个自下而上的DIP,并且它是以左下角起始的。

如果位图的高是负数,则该位图是一个自上而下的DIP,并且它是以左上角起始的。

当一个位图紧跟在BITMAPINFO 之 后时,该位图将被打包。打包的位图通过一个指针进行引用。

对于打包位图,当使用DIB_PAL_COLORS 模式时,BITMAPINFOHEADER 结构体的ClrUsed 必须被设置为一个偶数,这样DIB位图数组将从DWORD边界上开始。

如果一个位图保存在文件中,或者将要传送给其他应用程序,bmiColors 成 员不应该保护调色板索引。

位图的颜色表应保护明确的RGB数值,除非这个应用程序独占使用和控制 该位图。

BITMAPINFO 结构体由一个BITMAPINFOHEADER 结 构体以及一个跟在其后面的RGBQUAD 数值数组构成。数组的大小由BITMAPINFOHEADER结 构体的成员biClrUsed 决定。

在验证分配给BITMAPINFO 结 构体的buffer的大小之前,不要将一个颜色表拷贝到BITMAPINFO 结构体。

biSize
指定结构体的大小,以字节为单位。
该大小不包含biClrUsed 成员中提到的颜色表或者屏蔽位的大小。
详细请参考Remarks 。
biWidth
指定位图的宽,以像素为单位。
biHeight
指定位图的高,以像素为单位。
如果biHeight 正值,则该位图是一个自下而上的DIB,并且它从左下角开始。
如果biHeight 负值,则该位图是一个自上而下的DIB,并且它从左上角开始。
如果biHeight 负值,表明了一个自上而下的DIB,此时,biCompression 必须被设置为BI_RGB 或者 BI_BITFIELDS。自上而下的DIB不能被压缩。
biPlanes
指定目标设备平面层(plane)的个数。
该值必须被设置为1。
biBitCount
指定一个像素所占的位数。
BITMAPINFOHEADER 结构体的biBitCount 成员决定了一个像素占几个位,以及位图中包含的最大 的颜色数。
该成员只能包含一个如下的值:

Value

Description

1

说明该位图是一个黑白的,bmiColors 成 员包含两个条目。

在该位图中,每一位代表一个像素。

如果该位为0, 则该像素用bmiColors 表中的第一个条目中的颜色进行显示。

如果该位为1, 则该像素用bmiColors 表 中的第二个条目中的颜色进行显示。

2

位图可以有4种 颜色值。

4

位图最大可以有16种 颜色,bmiColors 成员包含16个条目。

位图中的每一个像素,由颜色表中的一个4位的索引进行表示。

例如,如果位图中的第一个字节为 0x1F,该字节表示两个像素。第一个像素 包含表中的第二个条目的颜色,第二个像素包含表中第16个条目的颜色。

8

位图最大可以有256种颜色,bmiColors 成 员包含256个条目。在这种情况下,数组中的每一个字节标示一个像素。

16

位图最大可以有2^16 种颜色。

如果BITMAPINFOHEADER 结构体的biCompression 成员为BI_RGB ,则bmiColors 成员NULL 

该位图中,每一个字代表一个像素。红色,绿色和蓝色的相 对强度,由每个颜色组件的5个位 来表示。

对应蓝色的值,在最低的5个位,其后是分别对应绿色和红色的各5位。

最高的一位没有使用。bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER 结 构体的biClrUsed 成员指定的条目的个数。

24

位图最大可以有2^24 种颜色,并且bmiColors 成 员为NULL。

位图数组中的每三个字节,表示一个像素中蓝色,绿色和红 色的相对强度。

bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER结构体的biClrUsed 成员指定的条目的个数。

32

位图最大可以有2^32 种颜色。如果结构 体BITMAPINFOHEADER 的成员biCompression为BI_RGB ,则成员bmiColors 为NULL。位图数组中的一个DWORD 代表一个像素中蓝色,绿色和红色的相对强度。DWORD 中的最高一个字节没有使用。bmiColors 颜色表用于优化基于调色板设备的颜色,并且必须包含BITMAPINFOHEADER 结 构体的biClrUsed成员指定的条目的个数。

如果结构体BITMAPINFOHEADER 的成员biCompression 为 BI_BITFIELDS,成员bmiColors 包含三个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色和蓝色。

位图数组中的一个DWORD 代表一个像

你可以将上表中的任何一个值与BI_SRCPREROTATE 进行或,以指定源DIB部分与目标部分有相同的转角。
biCompression
指定一个压缩的自下而上的位图(自上而下的DIB不能被压缩)的压缩类型。该成员可以包 含一个如下的值:

Value

Description

BI_RGB

一个未压缩的格式。

BI_BITFIELDS

指定该位图没有被压缩,并且颜色表中包含三 个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色和蓝色。

该值对16- 和 32-bpp 位 图有效。

该值对WinCE 2.0及以后版本有效。

BI_ALPHABITFIELDS

指定该位图没有被压缩,并且颜色表中包含三 个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色,蓝色和alpha组件。

该值对16- 和 32-bpp 位 图有效。

该值对WinCE 4.0及以后版本有效。

biSizeImage
指定image的大小,以size为单位。
对于BI_RGB 位图,该值可以设置为0。
biXPelsPerMeter
以每米中包含的像素的个数为单位,指定目标设备中对于位图的水 平分辨率。
应用程序可以使用该值,从源组中 选择一个最佳匹配当前设备特性的位图。
biYPelsPerMeter
以每米中包含的像素的个数为单位,指定目标设备中对于位图的 垂直分辨率。
biClrUsed
指定颜色表中,位图真正使用的颜色索引的个数。
如果该值为0, 位图使用成员biCompression 指定的压缩模式需要的,与成员biBitCount 相应的最大的颜色数。
如果该值为非0, 并且成员biBitCount 小 于16, 成员biClrUsed 指定图像引擎或者设备驱动真正使用的颜色数。
如果成员biBitCount 大于16, 成员biClrUsed 指定用于优化系统调色板性能的颜色表的大小。

  如果 strh子块是音频数据流,则strf子块的内容是一个WAVEFORMAT结构,如下:

typedef struct
{
 WORD wFormatTag;
 WORD nChannels; //声道数
 DWORD nSamplesPerSec; //采样率
 DWORD nAvgBytesPerSec; //WAVE声音中每秒的数据量
 WORD nBlockAlign; //数据块的对齐标志
 WORD biSize; //此结构的大小
}WAVEFORMAT

wFormatTag
音频数据的编码方式。1表示是PCM 编码。
nChannels
声道数,单声道为1,双声道为2。
nSamplesPerSec
采样率(每秒样本数), 比如44100等。
nAvgBytesPerSec
音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小。
nBlockAlign
每次采样的大小 = 采样精度*声道数/8(单位是字节); 这也是字节对齐的最小单位, 譬如 16bit 立体声在这里的值是 4 字节。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
biSize
附加数据的大小。

  "strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。

  "strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"movi" LIST块中的数据联系在一起,第一个数据流头结构用于数据流0,第二个用于数据流1,依次类推。

  数据块中存储视频和音频数据流,数据可直接存于 "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; //子块长度
};
 

AVI RIFF 文件参考

 

文档来源:MSDNLibrary->Win32 and COM Development->Graphics andMultimedia->Audio and Video->DirectShow->Appendixes->AVIFile Format-> AVI RIFF File Reference

 

微软的AVI文件格式是一种用于拍摄,编辑和播放音频,视频序列的RIFF文件格式。一般情况下, AVI文件包含多个流的不同类型的数据。大多数的AVI序列同时使用音频和视频数据流。一个简单的变种AVI序列使用视频数据而不需要音频流。

本节不描述OpenDML AVI文件格式的扩展。如需进一步关于这些扩展的资料,见AVI OpenDML的M-JPEG文件格式的小组委员会所发表的OpenDML AVI文件格式的扩展

 

FOURCCs

一个FOURCC(四字符代码)是一个由32位无符号整数所连接的四个ASCII字符。例如,FOURCC 'abcd'代表的小端(译者注:一种存放二进制数据的格式,所有数字的低位放在前面)系统为0x64636261。FOURCCs可以包含空格,' abc'是合法的FOURCC。在AVI文件格式中使用FOURCC码来识别流类型,数据块,索引项目,以及其他信息。

 

RIFF文件格式

AVI文件格式是基于RIFF(资源交换文件格式)文件格式的。一个RIFF文件包括一个RIFF头,后跟零个或多个list和chunk。

 

RIFF头格式如下:

'RIFF' fileSize fileType (data)

其中,'RIFF'是FOURCC的字面值,fileSize是4字节值表示的数据在文件中的大小,fileType是一个FOURCC表示的文件类型。fileSize的值包括fileType和data,并不包括'RIFF'和fileSize本身。Data由chunk和list以任意顺序组成。

 

Chunk格式如下:

CkID ckSize ckData

其中,ckID是FOURCC表示的chunk中数据的标识。ckSize是4字节标识的ckData中数据的大小,ckData是大于等于零的数据,都要填充到最接近的词边界。ckSize是chunk中有效数据的大小;并不包括填充,ckID和ckSize。

 

List格式如下:

'LIST' listSize listType listData

其中,'LIST'是FOURCC的字面值,listSize是4字节值表示的数据在文件中的大小,listType是FOURCC码,listData以任意顺序包含chunk和list。listSize包含listType和listData的大小,并不包括'LIST'和listSize本身。

 

本节余下的部分使用下例符号来描述RIFF chunk:

ckID ( ckData )

chunkSize被隐藏。使用下例符号来描述RIFF list:

'LIST' (listType (listData))

可选元素是放在括号中:[可选元素]

 

AVI RIFF格式:

AVI文件定义一个'AVI '的FOURCC在RIFF header中。所有的AVI文件包括两个强制性的list块,分别定义格式流和数据流。一个AVI文件可能还包括一个索引块,用于定位数据chunk在文件中的位置。一个AVI文件的组件如下:

RIFF ('AVI '

      LIST ('hdrl' ...)

      LIST ('movi' ...)

      ['idx1' ()]

     )

'hdrl'定义数据格式,是第一个需要的list块。'movi'包含AVI序列的数据,是第二个需要的list块。'idx1'包含索引。AVI文件必须保持这三个部分的顺序。

 

注意:OpenDML扩展定义另一种类型的索引,用FOURCC 'indx'表示。

 

'hdrl' and 'movi'用子chunk来存储数据。下面的例子展现了AVI RIFF所需要完成的chunk形式:

RIFF ('AVI '

      LIST ('hdrl'

            'avih'(

)

            LIST ('strl'

                  'strh'()

                  'strf'()

                  [ 'strd'() ]

                  [ 'strn'() ]

                  ...

                 )

             ...

           )

      LIST ('movi'

            {SubChunk | LIST ('rec '

                              SubChunk1

                              SubChunk2

                              ...

                             )

               ...

            }

            ...

           )

      ['idx1' () ]

     )

 

AVI头:

AVI 头以'hdrl'列表开始,包含一个'avih'块。头包括AVI文件的全局信息,如文件中包含的流的数量,AVI序列的高和宽。头chunk由一个AVIMAINHEADER结构组成。

 

typedef struct _avimainheader {

  FOURCC fcc;

  DWORD  cb;

  DWORD  dwMicroSecPerFrame;

  DWORD  dwMaxBytesPerSec;

  DWORD  dwPaddingGranularity;

  DWORD  dwFlags;

  DWORD  dwTotalFrames;

  DWORD  dwInitialFrames;

  DWORD  dwStreams;

  DWORD  dwSuggestedBufferSize;

  DWORD  dwWidth;

  DWORD  dwHeight;

  DWORD  dwReserved[4];

} AVIMAINHEADER;

 

AVI流头:

一个或多个'strl'列表跟在AVI头后面。每一个数据流需要一个'strl'列表,每一个'strl'列表包含一个流的信息,它必须包含'strh'的流头块和'strf'的流格式块。此外,'strl'可以包含'strd'的流头数据块和'strn'的流名称块。

'strh'流头块可以用AVISTREAMHEADER结构表示。

 

typedef struct _avistreamheader {

  FOURCC fcc;

  DWORD  cb;

  FOURCC fccType;

  FOURCC fccHandler;

  DWORD  dwFlags;

  WORD   wPriority;

  WORD   wLanguage;

  DWORD  dwInitialFrames;

  DWORD  dwScale;

  DWORD  dwRate;

  DWORD  dwStart;

  DWORD  dwLength;

  DWORD  dwSuggestedBufferSize;

  DWORD  dwQuality;

  DWORD  dwSampleSize;

  struct {

    short int left;

    short int top;

    short int right;

    short int bottom;

  } rcFrame;

} AVISTREAMHEADER;

 

'strf'流格式块必须跟在流头块的后面。流格式块描述流中的数据格式。这个块中的数据决定于流的类型。视频流由BITMAPINFO结构表示,如果适合会包括调色板信息。音频流由WAVEFORMATEX结构表示。

 

typedef struct tagBITMAPINFOHEADER {

  DWORD biSize;

  LONG  biWidth;

  LONG  biHeight;

  WORD  biPlanes;

  WORD  biBitCount;

  DWORD biCompression;

  DWORD biSizeImage;

  LONG  biXPelsPerMeter;

  LONG  biYPelsPerMeter;

  DWORD biClrUsed;

  DWORD biClrImportant;

} BITMAPINFOHEADER;

 

typedef struct {

  WORD  wFormatTag;

  WORD  nChannels;

  DWORD nSamplesPerSec;

  DWORD nAvgBytesPerSec;

  WORD  nBlockAlign;

  WORD  wBitsPerSample;

  WORD  cbSize;

} WAVEFORMATEX;

 

如果'strd'流头数据块存在,它将跟在流格式块后面。它的格式和内容决定于编解码器驱动程序。通常情况下,驱动用它做配置信息。应用程序,读取和写入AVI文件不需要解释此信息;他们可以简单的传输到驱动作为一个内存区块。

 

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

 

'hdrl'列表中的流头和'movi'列表中通过'strl'块相关联。第一个'strl'块使用Stream 0,第二个使用Stream 1,如此等等。

 

流数据 ('movi' 列表)

在头信息之后是'movi'列表包含真实的数据流,视频帧和音频样本。数据可以直接存放在'movi'列表中,也可以组织在'rec '列表中。组织在'rec '列表中意味着数据块应该一次性从硬盘读入,使得文件可以在CD-ROM中播放。

表示每个数据块的FOURCC由两字节的流编号和两字节的信息类型。

两字节代码

描述

db

非压缩视频帧

dc

压缩视频帧

pc

调色板更改

wb

音频数据

 

例如,如果Stream 0 包含音频,这个数据块应该是FOURCC '00wb'。如果Stream 1包含视频,这个数据块应该是FOURCC '01db'或'01dc'。视频数据块也可以定义新的调色板更新调色板中的AVI序列。每一个palette-change块('xxpc')包含一个AVIPALCHANGE结构。如果一个流包含调色板改变,设置AVISTREAMHEADER 结构中的dwFlags 的AVISF_VIDEO_PALCHANGES标志

 

typedef struct {

  BYTE         bFirstEntry;

  BYTE         bNumEntries;

  WORD         wFlags;

  PALETTEENTRY peNew[];

} AVIPALCHANGE

 

文本流可以使用任意两个字符代码。

 

AVI 索引

可选的'idx1'索引块出现在'movi'列表的后面。索引包括列表中的数据块和它们在文件中的位置。每一个数据块都可以用一个AVIOLDINDEX结构做索引,包括'rec '块。如果文件包含索引,将设置AVIMAINHEADER结构的dwFlags的AVIF_HASINDEX标志。

 

typedef struct _avioldindex {

  FOURCC                    fcc;

  DWORD                     cb;

  struct _avioldindex_entry {

    DWORD dwChunkId;

    DWORD dwFlags;

    DWORD dwOffset;

    DWORD dwSize;

  } aIndex[];

} AVIOLDINDEX;

 

其他数据chunk

可以在需要的时候插入'JUNK'块来对齐AVI文件。应用程序应该忽略JUNK块中的内容。