AVI檔案格式
AVI(Audio Video Interleaved的縮寫)是一種RIFF(Resource Interchange File Format的縮寫)檔案格式,多用於音視頻捕捉、編輯、回放等應用程式中。通常情況下,一個AVI檔案可以包含多個不同類型的媒體流(典型的情況下有一個音頻流和一個視頻流),不過含有單一音頻流或單一視頻流的AVI檔案也是合法的。AVI可以算是Windows作業系統上最基本的、也是最常用的一種媒體檔案格式。
先來介紹RIFF檔案格式。RIFF檔案使用四字元碼FOURCC(four-character code)來表徵資料類型,比如‘RIFF’、‘AVI ’、‘LIST’等。注意,Windows作業系統使用的位元組順序是little-endian,因此一個四字元碼‘abcd’實際的DWORD值應為0x64636261。另外,四字元碼中像‘AVI ’一樣含有空格也是合法的。
RIFF檔案首先含有一個檔案頭結構。
最開始的4個位元組是一個四字元碼‘RIFF’,表示這是一個RIFF檔案;緊跟著後面用4個位元組表示此RIFF檔案的大小;然後又是一個四字元碼說明檔案的具體類型(比如AVI、WAVE等);最後就是實際的資料。注意檔案大小值的計算方法為:實際資料長度 + 4(檔案類型域的大小);也就是說,檔案大小的值不包括‘RIFF’域和“檔案大小”域本身的大小。
RIFF檔案的實際資料中,通常還使用了列表(List)和塊(Chunk)的形式來組織。列表可以嵌套子列表和塊。其中,列表的結構為:‘LIST’ listSize listType listData ——‘LIST’是一個四字元碼,表示這是一個列表;listSize佔用4位元組,記錄了整個列表的大小;listType也是一個四字元碼,表示本列表的具體類型;listData就是實際的列表資料。注意listSize值的計算方法為:實際的列表資料長度 + 4(listType域的大小);也就是說listSize值不包括‘LIST’域和listSize域本身的大小。再來看塊的結構:ckID ckSize ckData ——ckID是一個表示塊類型的四字元碼;ckSize佔用4位元組,記錄了整個塊的大小;ckData為實際的塊資料。注意ckSize值指的是實際的塊資料長度,而不包括ckID域和ckSize域本身的大小。(注意:在下面的內容中,將以LIST ( listType ( listData ) )的形式來表示一個列表,以ckID ( ckData )的形式來表示一個塊,如[ optional element ]中括弧中的元素表示為可選項。)
接下來介紹AVI檔案格式。AVI檔案類型用一個四字元碼‘AVI ’來表示。整個AVI檔案的結構為:一個RIFF頭 + 兩個列表(一個用於描述媒體流格式、一個用於儲存媒體流資料) + 一個可選的索引塊。AVI檔案的展開結構大致如下:
RIFF (‘AVI ’
LIST (‘hdrl’
‘avih’(主AVI資訊頭資料)
LIST (‘strl’
‘strh’ (流的頭資訊資料)
‘strf’ (流的格式資訊資料)
[‘strd’ (可選的額外的頭資訊資料) ]
[‘strn’ (可選的流的名字) ]
...
)
...
)
LIST (‘movi’
{ SubChunk | LIST (‘rec ’
SubChunk1
SubChunk2
...
)
...
}
...
)
[‘idx1’ (可選的AVI索引塊資料) ]
)
本文轉自
http://www.ieee.org.cn/dispbbs.asp?boardID=61&ID=47093