AVI是音頻視頻交錯(Audio Video Interleaved)的英文縮寫,它是Microsoft公司開發的一種符合RIFF文件規範的數字音頻與視頻文件格式,原先用於Microsoft Video for Windows (簡稱VFW)環境,如今已被Windows 95/9八、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 Interchange File Format,資源互換文件格式)是微軟公司定義的一種用於管理windows環境中多媒體數據的文件格式,波形音頻wave,MIDI和數字視頻AVI 都採用這種格式存儲。構造RIFF文件的基本單元叫作數據塊(Chunk),每一個數據塊包含3個部分,
一、4字節的數據塊標記(或者叫作數據塊的ID)
二、數據塊的大小
三、數據
整個RIFF文件能夠當作一個數據塊,其數據塊ID爲RIFF,稱爲RIFF塊。一個RIFF文件中只容許存在一個RIFF塊。RIFF塊中包含一系列 的子塊,其中有一種字塊的ID爲"LIST",稱爲LIST,LIST塊中能夠再包含一系列的子塊,但除了LIST塊外的其餘全部的子塊都不能再包含子 塊。
RIFF和LIST塊分別比普通的數據塊多一個被稱爲形式類型(Form Type)和列表類型(List Type)的數據域,其組成以下:
一、4字節的數據塊標記(Chunk ID)
二、數據塊的大小
三、4字節的形式類型或者列表類型
四、數據
下面咱們看看AVI文件的結構。AVI文件是目前使用的最複雜的RIFF文件,它能同時存儲同步表現的音頻視頻數據。AVI的RIFF塊的形式類型是AVI,它包含3個子塊,以下所述:
一、信息塊,一個ID爲"hdrl"的LIST塊,定義AVI文件的數據格式。
二、數據塊,一個ID爲 "movi"的LIST塊,包含AVI的音視頻序列數據。
三、索引塊,ID爲 "idxl"的子塊,定義 "movi"LIST塊的索引數據,是可選塊。
AVI文件的結構以下圖所示,下面將具體介紹AVI文件的各子塊構造。
一、信息塊,信息塊包含兩個子塊,即一個ID爲 avih 的子塊和一個ID 爲 strl 的LIST塊。算法
![]() |
"avih"子塊的內容可由以下的結構定義:windows
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; |
"strl" LIST塊用於記錄AVI數據流,每一種數據流都在該LIST塊中佔有3個子塊,他們的ID分別是"strh","strf", "strd";
"strh"子塊由以下結構定義。ide
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; |
"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; |
若是 strh子塊是音頻數據流,則strf子塊的內容是一個WAVEFORMAT結構,以下:操作系統
typedef struct { WORD wFormatTag; WORD nChannels; //聲道數 DWORD nSamplesPerSec; //採樣率 DWORD nAvgBytesPerSec; //WAVE聲音中每秒的數據量 WORD nBlockAlign; //數據塊的對齊標誌 WORD biSize; //此結構的大小 }WAVEFORMAT |
"strd"子塊緊跟在strf子塊後,存儲供壓縮驅動程序使用的參數,不必定存在,也沒有固定的結構。
"strl" LIST塊定義的AVI數據流依次將 "hdrl " LIST 塊中的數據流頭結構與"movi" LIST塊中的數據聯繫在一塊兒,第一個數據流頭結構用於數據流0,第二個用於數據流1,依次類推。
數據塊中存儲視頻和音頻數據流,數據可直接存於 "movi" LIST塊中。數據塊中音視頻數據按不一樣的字塊存放,其結構以下所述,
音頻字塊
"##wb"
Wave 數據流
視頻子塊中存儲DIB數據,又分爲壓縮或者未壓縮DIB,
"##db"
RGB數據流
"##dc"
壓縮的圖像數據流orm
(若是第一個流是音頻,則4字符碼爲‘00wb’;第二個流是視頻,則4字符碼爲‘00db’或‘00dc’) ..... (網上原話,多是01db或01dc)視頻
看到了吧,avi文件的圖像數據能夠是壓縮的,和非壓縮格式的。對於壓縮格式來講,也可採用不一樣的編碼,也許你曾經遇到有些avi無法識別,就是由於編 碼方式不同,若是沒有相應的解碼,你就無法識別視頻數據。AVI的編碼方式有不少種,比較常見的有 mpeg2,mpeg4,divx等。blog
索引塊,索引快包含數據塊在文件中的位置索引,能提升avi文件的讀寫速度,其中存放着一組AVIINDEXENTRY結構數據。以下,這個塊並非必需的,也許不存在。
索引
typedef struct
{
DWORD ckid; //記錄數據塊中子塊的標記
DWORD dwFlags; //表示chid所指子塊的屬性
DWORD dwChunkOffset; //子塊的相對位置
DWORD dwChunkLength; //子塊長度
};資源