微軟的 AVI 文件格式是一種用于捕獲、編輯和回放 audio-video 序列的 RIFF 文件規(guī)范,??傮w上講,AVI 文件包含多個(gè)針對(duì)不同數(shù)據(jù)的流,。 大部分 AVI 序列使用 audio 和 video 流,。 一個(gè)簡(jiǎn)單的 AVI序列特例可以只包含 video 數(shù)據(jù)而不包含 audio 數(shù)據(jù)。 本部分并沒(méi)有介紹 OpenDML 對(duì)于 AVI 文件格式的擴(kuò)展,。如果要對(duì)其深入研究,, 請(qǐng)參考 OpenDML AVI M-JPEG 文件格式小組委員會(huì)出版的《OpenDML AVI File Format Extensions 》。
FOURCCs
一個(gè) FOURCC(
four-character code,,4字符碼)是一個(gè)包含4個(gè)ASCII碼字符串的32位的無(wú)符號(hào)整型數(shù)據(jù),。例如,,
在 Little-Endian 系統(tǒng)中, FOURCC 'abcd' 表示為 0x64636261,。FOURCC中也可以包含空格,,如 ' abc' 也是一個(gè)有效的FOURCC。 AVI 文件使用 FOURCC碼標(biāo)示流的類型,、數(shù)據(jù)chunk,、index元素, 和其他的信息,。
RIFF 文件格式
AVI 文件格式是基于 RIFF ( resource interchange file format ) 文檔格式的,。一個(gè) RIFF 文件包含一個(gè)RIFF 頭, 以及其后的多個(gè) list 和 chunk,。
本文的余下內(nèi)容,,將用以下符號(hào)表示 RIFF chunk: ckID ( ckData ),。 其中chunk大小的概念比較模糊。使用以上符號(hào),,一個(gè)list可以表示為: 'LIST' ( listType ( listData ) ),。 可選成員被放到了方括號(hào)中:[可選成員]
AVI RIFF Form
AVI 文件在 RIFF 頭中用 FOURCC 碼'AVI '標(biāo)示。所有的AVI文件都被強(qiáng)制要求包含兩個(gè)LIST 類型的chunk,分別定義了stream的格式和stream的數(shù)據(jù),。 一個(gè)AVI文件還可能包含一個(gè)index chunk,,其中包含了數(shù)據(jù)chunk在文件中的位置。包含以上部分的AVI文件的格式為:
|
Value |
Description |
AVIF_COPYRIGHTED |
表明AVI文件包含了版權(quán)數(shù)據(jù)和軟件,。如果設(shè)置了改標(biāo)志,,將不允許軟件對(duì)該數(shù)據(jù)進(jìn)行拷貝。 |
AVIF_HASINDEX |
表明AVI文件包含一個(gè)index,。 |
AVIF_ISINTERLEAVED |
表明AVI文件是交叉的,。 |
AVIF_MUSTUSEINDEX |
表明應(yīng)用程序需要使用index,而不是物理上的順序,,來(lái)定義數(shù)據(jù)的展現(xiàn)順序,。例如,該標(biāo)志可以用于創(chuàng)建一個(gè)編輯用的幀列表,。 |
AVIF_WASCAPTUREFILE |
表明該文件是一個(gè)用于捕獲實(shí)時(shí)視頻的,,而特別分配的AVI 文件。如果一個(gè)文件設(shè)置了該標(biāo)志,,在用戶寫(xiě)該文件之前,,應(yīng)用程序應(yīng)該發(fā)出警告,因?yàn)橛脩艨赡軙?huì)對(duì)該文件進(jìn)行碎片整理,。 |
AVIF_COPYRIGHTED |
0x00020000 |
AVIF_HASINDEX |
0x00000010 |
AVIF_ISINTERLEAVED |
0x00000100 |
AVIF_MUSTUSEINDEX |
0x00000020 |
AVIF_WASCAPTUREFILE |
0x00010000 |
TRUSTCKTYPE |
0x00000800 |
dwTotalFrames
指定本文件中包含的幀數(shù)據(jù)的總數(shù),。也就是指定文件中總共包含多少幀。
dwInitialFrames
指定交錯(cuò)文件中的初始幀,。非交錯(cuò)文件,,該參數(shù)應(yīng)該被設(shè)置為0。如果你正在創(chuàng)建一個(gè)交錯(cuò)文件,,在該參數(shù)中指定文件中,,AVI文件的初始幀之前,幀的數(shù)量,,
即文件中在初始幀前面還有多少幀,。
為了讓音頻驅(qū)動(dòng)有足夠的音頻去處理,交錯(cuò)文件中的音頻數(shù)據(jù)必須與視頻數(shù)據(jù)有一定的偏移,。通常情況下,,音頻數(shù)據(jù)必須前移足夠的幀,以使大約0.75秒的音頻數(shù)據(jù)被預(yù)裝,。
應(yīng)該將音頻數(shù)據(jù)中偏移的幀數(shù)設(shè)置到成員dwInitialRecords(未找到該成員,,懷疑應(yīng)該是dwInitialFrames)。音頻流header的結(jié)構(gòu)體AVISTREAMHEADER的dwInitialFrames 成員,,
應(yīng)該被設(shè)置為同樣的值,。
dwStreams
指定文件中包含的流的數(shù)量。例如,,一個(gè)包含視頻和音頻數(shù)據(jù)的文件有兩個(gè)流,。
dwSuggestedBufferSize
指定讀該文件用的建議的緩存大小。一般來(lái)說(shuō),,該大小要足以包含文件中最大的數(shù)據(jù)塊(chunk),。如果該成員被設(shè)置為0,或者太小,,播放軟件在播放時(shí)就需要重新分配內(nèi)容,,
這將導(dǎo)致性能的下降。對(duì)于一個(gè)交叉文件,,該緩存大小應(yīng)該足以讀取一整條記錄(在movi list中,,有的數(shù)據(jù)以chunk的形式存在,有的數(shù)據(jù)以record即記錄的形式存在,,一個(gè)record 是
多個(gè)chunk的組合),,而不是一個(gè)chunk。
dwWidth
指定該AVI文件的寬,,以像素為單位,。
dwHeight
指定該AVI文件的高,,以像素為單位。
dwReserved
保留,,設(shè)置為0,。
Requirements
Header: Aviriff.h.
----------------AVISTREAMHEADER
結(jié)構(gòu)體
------------------------
AVISTREAMHEADER
結(jié)構(gòu)體包含了
AVI
文件中一個(gè)流的相關(guān)信息。
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
指定一個(gè)FOURCC碼,,此處必須為'strh',。
cb
指定結(jié)構(gòu)體的大小,不包含開(kāi)頭的8字節(jié),,即fcc和cb所占的空間,。
fccType
包含一個(gè)標(biāo)識(shí)流中數(shù)據(jù)類型的FOURCC碼。針對(duì)視頻和音頻,,標(biāo)準(zhǔn)的AVI值定義如下:
FOURCC |
Description |
'auds' |
Audio stream |
'mids' |
MIDI stream |
'txts' |
Text stream |
'vids' |
Video stream |
fccHandler
該成員是可選的,,包含了一個(gè)FOURCC碼,用于標(biāo)識(shí)一個(gè)特定的數(shù)據(jù)處理程序,。該數(shù)據(jù)處理程序是該流的首選數(shù)據(jù)處理程序,。對(duì)于視頻流和音頻流來(lái)說(shuō),這是一個(gè)解碼流時(shí)用的編解碼器,。
dwFlags
包含數(shù)據(jù)流的所有標(biāo)志,。這些標(biāo)志的高位序字,具體到流中包含的數(shù)據(jù)類型(意思應(yīng)該是,,這些標(biāo)志的高位,,說(shuō)明了流的類型)。標(biāo)準(zhǔn)標(biāo)志定義如下:
AVISF_DISABLED |
表明該流默認(rèn)情況下不被啟用,。 |
AVISF_VIDEO_PALCHANGES |
表明該流中包含調(diào)色板變換,。該標(biāo)志提示播放軟件,它需要可變的調(diào)試板,。 |
wPriority
指定一種流的優(yōu)先級(jí),。例如,一個(gè)文件中包含了多個(gè)音頻流,,其中優(yōu)先級(jí)最高的可能會(huì)是默認(rèn)的流,。
wLanguage
Language tag.
dwInitialFrames
指定在交叉文件中,音頻流相對(duì)于視頻流要向前偏移多少,。通常情況下,,是大約0.75秒。如果你正在創(chuàng)建交叉文件,,在該成員中指定文件中,,AVI序列的初始幀之前,幀的數(shù)量,。詳細(xì)信息,,請(qǐng)參考AVIMAINHEADER結(jié)構(gòu)體中 dwInitialFrames 成員,。
dwScale
與 dwRate 一起,決定該流所要使用的時(shí)間尺度,。用dwScale 去除dwRate ,,得到一秒鐘樣本的數(shù)量。對(duì)于視頻流,,這就是幀率( fram rate ),。對(duì)于音頻流,,這個(gè)頻率相當(dāng)于播放nBlockAlign 個(gè)字節(jié)的音頻需要的時(shí)間,,對(duì)于PCM音頻,它只是采樣率,。
dwRate
參考dwScale.
dwStart
指定這個(gè)流開(kāi)始的時(shí)間,。其單位有主文件頭中的dwRate 和dwScale 成員定義(即其單位是dwRate/dwScale)。通常,,dwStart是0,,但是它也可以為不與文件同時(shí)啟動(dòng)的流定義一個(gè)時(shí)間延遲。
dwLength
指定這個(gè)流的長(zhǎng)度,。單位由流的頭信息中的dwRate 和dwScale 來(lái)確定(即其單位是dwRate/dwScale),。(對(duì)于視頻流,dwLength就是流包含的總幀數(shù),;對(duì)于音頻流,,dwLength就是包含的block的數(shù)量,block是音頻解碼器能處理的原子單位),。dwLength/(dwRate/dwScale),,即dwLength * dwScale / dwRate,可以得到流的總時(shí)長(zhǎng),。
dwSuggestedBufferSize
指定讀該流時(shí)需要的緩存的大小,。通常情況下,這是一個(gè)與該流中最大的chunk的大小相對(duì)應(yīng)的值,。使用準(zhǔn)確的緩存大小,,可以提高播放器的性能。如果你不知道準(zhǔn)確的緩存大小,,可以設(shè)置為0,。
dwQuality
指定一個(gè)流數(shù)據(jù)的質(zhì)量指標(biāo)。該指標(biāo)是一個(gè)0到10,000的數(shù)值,。對(duì)于壓縮數(shù)據(jù),,這通常是一個(gè)作為質(zhì)量參數(shù)值傳給壓縮軟件的數(shù)值。如果該值為-1,,驅(qū)動(dòng)將使用默認(rèn)的質(zhì)量值,。
dwSampleSize
指定 一個(gè)數(shù)據(jù)樣本的大小,。如果樣本的大小可變,該成員將被設(shè)置為0,。如果該值為非0,,該文件中的多個(gè)樣本可以組成一個(gè)信號(hào)chunk。如果該值為0,,數(shù)據(jù)中的每個(gè)樣本(例如,,一個(gè)視頻幀)必須放在一個(gè)單獨(dú)的chunk中。對(duì)于視頻流,,該數(shù)值通常為0,,雖然當(dāng)所有的視頻幀都具有相同的大小時(shí),它也可以為非0,。對(duì)于音頻流,,該數(shù)值應(yīng)該和結(jié)構(gòu)體WAVEFORMATEX中的成員nBlockAlign一致。
rcFrame
指定一個(gè)在由AVI主頭結(jié)構(gòu)中的dwWidth 成員和dwHeight 成員決定的電影矩形中,,文本流或視頻流的目標(biāo)矩形,。rcFrame 成員通常用于支持多個(gè)視頻流。將該矩形設(shè)置為與電影矩形對(duì)應(yīng)的坐標(biāo),,以更新整個(gè)電影矩形,。該成員的單位是像素。目標(biāo)矩形的左上角與電影矩形的左上角關(guān)聯(lián),。
Remarks
該結(jié)構(gòu)體的部分成員在結(jié)構(gòu)體AVIMAINHEADER中也存在,。AVIMAINHEADER中的數(shù)據(jù)是針對(duì)整個(gè)文件的,AVISTREAMHEADER中的數(shù)據(jù)是針對(duì)單個(gè)流的,。
Requirements
Header: Aviriff.h.
----------------BITMAPINFO
結(jié)構(gòu)體
------------------------
BITMAPINFO
結(jié)構(gòu)體定義了一個(gè)基于
windows
的
DIB(
device-independent bitmap)
的尺寸和顏色信息,。
Syntax
typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO;
一個(gè)設(shè)備無(wú)關(guān)的位圖包含兩個(gè)不同的部分:一個(gè)描述位圖尺寸和顏色的BITMAPINFO結(jié)構(gòu)體,,和一個(gè)定義位圖像素的字節(jié)數(shù)組。數(shù)組中的數(shù)據(jù)排列在一起,,但是必須用0將每個(gè)掃描行與LONG類型邊界對(duì)齊,。
如果位圖的高是正數(shù),則該位圖是一個(gè)自下而上的DIP,,并且它是以左下角起始的,。
如果位圖的高是負(fù)數(shù),則該位圖是一個(gè)自上而下的DIP,,并且它是以左上角起始的,。
當(dāng)一個(gè)位圖緊跟在BITMAPINFO 之后時(shí),該位圖將被打包,。打包的位圖通過(guò)一個(gè)指針進(jìn)行引用,。
對(duì)于打包位圖,,當(dāng)使用DIB_PAL_COLORS 模式時(shí),,BITMAPINFOHEADER 結(jié)構(gòu)體的ClrUsed 必須被設(shè)置為一個(gè)偶數(shù),這樣DIB位圖數(shù)組將從DWORD邊界上開(kāi)始,。
如果一個(gè)位圖保存在文件中,,或者將要傳送給其他應(yīng)用程序,bmiColors 成員不應(yīng)該保護(hù)調(diào)色板索引,。
位圖的顏色表應(yīng)保護(hù)明確的RGB數(shù)值,,除非這個(gè)應(yīng)用程序獨(dú)占使用和控制該位圖。
Security Note 包括無(wú)效格式描述的普通級(jí)別的錯(cuò)誤,,可以在內(nèi)容(哪兒,?)中找到。例如,,顏色表可以跟在BITMAPINFOHEADER 結(jié)構(gòu)體后面,。
BITMAPINFO 結(jié)構(gòu)體由一個(gè)BITMAPINFOHEADER 結(jié)構(gòu)體以及一個(gè)跟在其后面的RGBQUAD 數(shù)值數(shù)組構(gòu)成。數(shù)組的大小由BITMAPINFOHEADER結(jié)構(gòu)體的成員biClrUsed 決定,。
在驗(yàn)證分配給BITMAPINFO 結(jié)構(gòu)體的buffer的大小之前,,不要將一個(gè)顏色表拷貝到BITMAPINFO 結(jié)構(gòu)體。
OS
Versions: Windows
CE 1.0 and later.
Header: Windows.h.
----------------BITMAPINFOHEADER
結(jié)構(gòu)體
------------------------
(以下的解釋來(lái)自:
http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx
,。后面還會(huì)有一個(gè)對(duì)該結(jié)構(gòu)體的說(shuō)明,,與此稍有不同。)
該結(jié)構(gòu)體包含了一個(gè)
DIB(device-independent bitmap)
尺寸和顏色個(gè)數(shù)的信息,。
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 |
說(shuō)明該位圖是一個(gè)黑白的,,bmiColors 成員包含兩個(gè)條目,。 在該位圖中,每一位代表一個(gè)像素,。 如果該位為0,, 則該像素用bmiColors 表中的第一個(gè)條目中的顏色進(jìn)行顯示。 如果該位為1,, 則該像素用bmiColors 表中的第二個(gè)條目中的顏色進(jìn)行顯示,。 |
2 |
位圖可以有4種顏色值。 |
4 |
位圖最大可以有16種顏色,,bmiColors 成員包含16個(gè)條目,。 位圖中的每一個(gè)像素,由顏色表中的一個(gè)4位的索引進(jìn)行表示,。 例如,,如果位圖中的第一個(gè)字節(jié)為 0x1F,該字節(jié)表示兩個(gè)像素,。第一個(gè)像素包含表中的第二個(gè)條目的顏色,,第二個(gè)像素包含表中第16個(gè)條目的顏色。 |
8 |
位圖最大可以有256種顏色,bmiColors 成員包含256個(gè)條目,。在這種情況下,,數(shù)組中的每一個(gè)字節(jié)標(biāo)示一個(gè)像素。 |
16 |
位圖最大可以有2^16 種顏色,。 如果BITMAPINFOHEADER 結(jié)構(gòu)體的biCompression 成員為BI_RGB ,,則bmiColors 成員NULL 。 該位圖中,,每一個(gè)字代表一個(gè)像素,。紅色,綠色和藍(lán)色的相對(duì)強(qiáng)度,,由每個(gè)顏色組件的5個(gè)位來(lái)表示,。 對(duì)應(yīng)藍(lán)色的值,在最低的5個(gè)位,,其后是分別對(duì)應(yīng)綠色和紅色的各5位,。 最高的一位沒(méi)有使用。bmiColors 顏色表用于優(yōu)化基于調(diào)色板設(shè)備的顏色,,并且必須包含BITMAPINFOHEADER 結(jié)構(gòu)體的biClrUsed 成員指定的條目的個(gè)數(shù),。 |
24 |
位圖最大可以有2^24 種顏色,并且bmiColors 成員為NULL,。 位圖數(shù)組中的每三個(gè)字節(jié),,表示一個(gè)像素中藍(lán)色,,綠色和紅色的相對(duì)強(qiáng)度,。 bmiColors 顏色表用于優(yōu)化基于調(diào)色板設(shè)備的顏色,并且必須包含BITMAPINFOHEADER結(jié)構(gòu)體的biClrUsed 成員指定的條目的個(gè)數(shù),。 |
32 |
位圖最大可以有2^32 種顏色,。如果結(jié)構(gòu)體BITMAPINFOHEADER 的成員biCompression為BI_RGB ,則成員bmiColors 為NULL,。位圖數(shù)組中的一個(gè)DWORD 代表一個(gè)像素中藍(lán)色,,綠色和紅色的相對(duì)強(qiáng)度。DWORD 中的最高一個(gè)字節(jié)沒(méi)有使用,。bmiColors 顏色表用于優(yōu)化基于調(diào)色板設(shè)備的顏色,,并且必須包含BITMAPINFOHEADER 結(jié)構(gòu)體的biClrUsed成員指定的條目的個(gè)數(shù)。 如果結(jié)構(gòu)體BITMAPINFOHEADER 的成員biCompression 為 BI_BITFIELDS,,成員bmiColors 包含三個(gè)DWORD 顏色掩碼,,分別用于指定一個(gè)像素中的紅色,綠色和藍(lán)色,。 位圖數(shù)組中的一個(gè)DWORD 代表一個(gè)像素,。 |
Value |
Description |
---|---|
BI_RGB |
一個(gè)未壓縮的格式。 |
BI_BITFIELDS |
指定該位圖沒(méi)有被壓縮,,并且顏色表中包含三個(gè)DWORD 顏色掩碼,,分別用于指定一個(gè)像素中的紅色,綠色和藍(lán)色,。 該值對(duì)16- 和 32-bpp 位圖有效,。 該值對(duì)WinCE 2.0及以后版本有效。 |
BI_ALPHABITFIELDS |
指定該位圖沒(méi)有被壓縮,,并且顏色表中包含三個(gè)DWORD 顏色掩碼,,分別用于指定一個(gè)像素中的紅色,綠色,,藍(lán)色和alpha組件,。 該值對(duì)16- 和 32-bpp 位圖有效。 該值對(duì)WinCE 4.0及以后版本有效,。 |
|
來(lái)自: changqiong0606 > 《avi》