微软的 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。
本文的余下内容,将用以下符号表示 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文件的格式为:
|
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。
Requirements
Header: Aviriff.h.
----------------AVISTREAMHEADER
结构体
------------------------
AVISTREAMHEADER
结构体包含了
AVI
文件中一个流的相关信息。
Syntax
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;
Members
fcc
指定一个FOURCC码,此处必须为'strh'。
cb
指定结构体的大小,不包含开头的8字节,即fcc和cb所占的空间。
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)。通常,dwStart是0,但是它也可以为不与文件同时启动的流定义一个时间延迟。
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中的数据是针对单个流的。
Requirements
Header: Aviriff.h.
----------------BITMAPINFO
结构体
------------------------
BITMAPINFO
结构体定义了一个基于
windows
的
DIB(
device-independent bitmap)
的尺寸和颜色信息。
Syntax
typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO;
一个设备无关的位图包含两个不同的部分:一个描述位图尺寸和颜色的BITMAPINFO结构体,和一个定义位图像素的字节数组。数组中的数据排列在一起,但是必须用0将每个扫描行与LONG类型边界对齐。
如果位图的高是正数,则该位图是一个自下而上的DIP,并且它是以左下角起始的。
如果位图的高是负数,则该位图是一个自上而下的DIP,并且它是以左上角起始的。
当一个位图紧跟在BITMAPINFO 之后时,该位图将被打包。打包的位图通过一个指针进行引用。
对于打包位图,当使用DIB_PAL_COLORS 模式时,BITMAPINFOHEADER 结构体的ClrUsed 必须被设置为一个偶数,这样DIB位图数组将从DWORD边界上开始。
如果一个位图保存在文件中,或者将要传送给其他应用程序,bmiColors 成员不应该保护调色板索引。
位图的颜色表应保护明确的RGB数值,除非这个应用程序独占使用和控制该位图。
Security Note 包括无效格式描述的普通级别的错误,可以在内容(哪儿?)中找到。例如,颜色表可以跟在BITMAPINFOHEADER 结构体后面。
BITMAPINFO 结构体由一个BITMAPINFOHEADER 结构体以及一个跟在其后面的RGBQUAD 数值数组构成。数组的大小由BITMAPINFOHEADER结构体的成员biClrUsed 决定。
在验证分配给BITMAPINFO 结构体的buffer的大小之前,不要将一个颜色表拷贝到BITMAPINFO 结构体。
OS
Versions: Windows
CE 1.0 and later.
Header: Windows.h.
----------------BITMAPINFOHEADER
结构体
------------------------
(以下的解释来自:
http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx
。后面还会有一个对该结构体的说明,与此稍有不同。)
该结构体包含了一个
DIB(device-independent bitmap)
尺寸和颜色个数的信息。
Syntax
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;
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 代表一个像素。 |
Value |
Description |
---|---|
BI_RGB |
一个未压缩的格式。 |
BI_BITFIELDS |
指定该位图没有被压缩,并且颜色表中包含三个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色和蓝色。 该值对16- 和 32-bpp 位图有效。 该值对WinCE 2.0及以后版本有效。 |
BI_ALPHABITFIELDS |
指定该位图没有被压缩,并且颜色表中包含三个DWORD 颜色掩码,分别用于指定一个像素中的红色,绿色,蓝色和alpha组件。 该值对16- 和 32-bpp 位图有效。 该值对WinCE 4.0及以后版本有效。 |
|
来自: changqiong0606 > 《avi》