微软的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头的格式:
‘RIFF’+文件大小+文件类型+(数据)
'RIFF'就是FOURCC码'RIFF'。文件大小是一个表示文件中数据大小的4字节值。文件类型是一个FOURCC码,表示文件类型。文件大小,包含的是文件类型以及其后数据的大小,不包含FOURCC码'RIFF'和文件大小本身所占的空间。
-
块(chunk)的格式:
ckID+ckSize+ckData
其中,ckID是一个说明该chunk中所包含的数据的FOURCC码。szSize是表示ckData中数据大小的4字节数值。ckData是0个或多个字节的数据。数据总是填充到就近的WORD边界。ckSize表示的是chunk中有效数据的大小,它不包括填充部分的大小,以及ckID和ckSize所占的空间。
-
List格式:
'LSIT'+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 '
SubChunk1
SubChunk2
...
)
...
}
...
)
['idx1' (<AVI Index>) ]
)
AVI Main Header
'hdrl' list
的开头部分是一个包含主
AVI header
的
'avih' chunk
。主
header
中包含了
AVI
文件的一些全局信息,如:文件中包含多少个流,
AVI
序列的宽高等等。主
header chunk
的内容可以用结构体
AVIMAINHEADER
表示。
AVI Stread 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
中数据的类型。
Two-character code
|
Description
|
db
|
Uncompressed video frame
|
dc
|
Compressed video frame
|
pc
|
Palette change
|
wb
|
Audio data
|
例如,如果
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
所包含的内容。
===============================
相关结构体
========================================
----------------AVIMAINHEADER
结构体
------------------------
AVIMAINHEADER
结构体中定义了
AVI
文件的全局信息。
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;
fcc
FOURCC码。此处必须为'avih'。
cb
结构体的大小,不包括开头 的8字节。
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。
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;
Members
bmiHeader
指定一个包含尺寸和颜色格式信息的位图信息头结构体。使用BITMAPINFOHEADER结构体。
bmiColors
包含下列之一:
- 一个RGBQUAD结构体的数组。其成员构成颜色表。
-
- 一个指定当前实现了的逻辑调色板中 的索引的16位无符号整型。
-
使用DIB的函数允许使用bmiColors的这种用法。如果bmiColors包含了一个已实现的逻辑调色板的索引,它们必须调用如下的位图函数:CreateDIBPatternBrushPt和CreateDIBSection。CreateDIBSection函数的参数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数值,除非这个应用程序独占使用和控制该位图。
Security Note包括无效格式描述的普通级别的错误,可以在内容(哪儿?)中找到。例如,颜色表可以跟在BITMAPINFOHEADER结构体后面。
BITMAPINFO结构体由一个BITMAPINFOHEADER结构体以及一个跟在其后面的RGBQUAD数值数组构成。数组的大小由BITMAPINFOHEADER结构体的成员biClrUsed决定。
在验证分配给BITMAPINFO结构体的buffer的大小之前,不要将一个颜色表拷贝到BITMAPINFO结构体。
Requirements
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;
Members
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代表一个像素。
|
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及以后版本有效。
|
你可以将上表中的任何一个值与BI_SRCPREROTATE进行或,以指定源DIB部分与目标部分有相同的转角。
biSizeImage
指定image的大小,以size为单位。
对于BI_RGB位图,该值可以设置为0。
biXPelsPerMeter
以每米中包含的像素的个数为单位,指定目标设备中对于位图的水平分辨率。
应用程序可以使用该值,从源组中选择一个最佳匹配当前设备特性的位图。
biYPelsPerMeter
以每米中包含的像素的个数为单位,指定目标设备中对于位图的垂直分辨率。
biClrUsed
指定颜色表中,位图真正使用的颜色索引的个数。
如果该值为0, 位图使用成员biCompression指定的压缩模式需要的,与成员biBitCount相应的最大的颜色数。
如果该值为非0, 并且成员biBitCount小于16, 成员biClrUsed指定图像引擎或者设备驱动真正使用的颜色数。
如果成员biBitCount大于16, 成员biClrUsed指定用于优化系统调色板性能的颜色表的大小。
如果成员biBitCount<span sty
相关推荐
1. **文件结构**:AVI文件采用RIFF(Resource Interchange File Format)结构,将数据分块存储,每个块都有一个4字节的标识符和4字节的大小信息。 2. **交错性**:AVI文件支持音视频交错,即视频帧和对应的音频样本...
AVI 文件采用的是 RIFF 文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理 Windows 环境中多媒体数据的文件格式,波形音频 wave,MIDI 和数字视频 AVI 都采用...
第二部分,则是注重介绍AVI文件的格式,让我们深入了解AVI格式究竟是怎么一回事。第三部分则是利用一个程序分析一个AVI文件的格式,让我们了解AVI里各部分CHUNK或LIST的信息。相信经过这三部分的学习,即使是初学者...
AVIMaster is a command line tool ...1、RIFF文件的解析,部分支持AIFF和RIFX,可解码WAVE和AVI文件结构 2、可支持细化的输出配置。 3、可重建AVI索引,即使是索引表损坏的文件也可以。(当然初始的1至4KB必须可用)
AVI文件采用了RIFF (Resource Interchange File Format)文件结构,这是一种由微软公司定义的用于管理Windows环境中多媒体数据的通用文件格式。波形音频(Wave)、MIDI以及数字视频AVI等都采用了这种格式进行存储。 ...
AVI文件采用的是基于RIFF(Resource Interchange File Format)的框架,将音频和视频数据交错存储。文件主要由两个部分组成:Header块和Data块。Header块包含文件的元信息,如视频流和音频流的信息,而Data块则存储...
1. 文件读写操作:理解RIFF(Resource Interchange File Format)结构,这是AVI文件的基础,包含了一系列的块,每个块都有自己的类型和数据。 2. 视频和音频解码/编码:熟悉各种编解码器,如DivX、XviD等用于视频,...
在AVI文件中,最重要的头信息是`RIFF`块,它标识文件类型为`AVI `。接着是`LIST`块,通常包含了`hdrl`(header list)和`movi`(movie data)两个子块。`hdrl`中包含了`avih`(AVI header)和`strl`(stream list)...
对于更深入地了解 RIFF 文件格式和安装压缩器/解压缩器的信息,请参考《Microsoft Windows 多媒体程序员指南》和《Microsoft Windows 多媒体程序员参考手册》。关于视频压缩和解压缩驱动的更多信息,请参阅第 10 章...
AVI 文件采用的是 RIFF 文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理 Windows 环境中多媒体数据的文件格式,波形音频 wave、MIDI 和数字视频 AVI 都采用...
AVI 文件基于 RIFF(Resource Interchange File Format)文件规格,这是一种用于组织不同类型的多媒体数据的标准文件格式。一个典型的 AVI 文件结构包括以下几个关键部分: 1. **RIFF 头部**:文件以 "RIFF" 开始,...
AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式...
AVI文件基于RIFF(Resource Interchange File Format)结构,这是一个通用的文件格式,用于存储不同类型的数据。RIFF文件由四字节码(FOURCC)标识,如'RIFF'、'AVI '、'LIST'等。FOURCC是一种标识特定数据类型的...
AVI文件格式是一种基于RIFF(Resource Interchange File Format)的多媒体容器,广泛应用于音频和视频数据的存储,尤其在Windows操作系统中常见。它允许在一个文件中同时包含多个不同的媒体流,例如音频和视频,使得...
1. **RIFF 块**:这是 AVI 文件的第一个块,用来标识这是一个 RIFF(Resource Interchange File Format)类型的文件。紧接着 RIFF 标识的是该文件的总大小,随后是 AVI 文件特有的标识符。 2. **List 块**:在 RIFF ...
AVI文件采用RIFF(Resource Interchange File Format)结构,由一系列称为“块”或“清单”的数据组成。在C++中实现AVI文件封装,我们需要理解这些块的结构,并创建一个类来处理相关的读写操作。 首先,我们的类...
1. **文件分析**:首先,代码会读取AVI文件的头信息,检查文件的基本结构,包括RIFF(Resource Interchange File Format)块和AVI清单。这有助于确定文件是否可修复,以及需要修复哪些部分。 2. **错误检测**:代码...
- **RIFF 头**: 包含四个字节的“RIFF”标识,接着是文件类型标识“AVI ”,然后是文件总大小(不包括RIFF头的8个字节)。最后是一个或多个`LIST`块。 - **LIST 块**: `LIST`块可以包含多个子`LIST`,比如`hdrl`(头...
RIFF(Resource Interchange File Format)格式是一种广泛用于存储音频、视频和其他数据的文件格式,尤其在Windows系统中常见。它的设计目标是提供一个简单、灵活的文件结构,允许不同类型的媒体数据存储在一个单一...
对于更多关于RIFF文件的信息,可以参考微软的Windows多媒体程序员指南和参考文献。关于安装式压缩器和解压缩器,可以在第十章“视频压缩和解压缩驱动程序”中找到详细内容。这些资源将帮助开发者深入理解如何创建和...