http://blog.csdn.net/lxmnet123/article/details/10742503
AVI:Audio/Video Interleaved(視音頻交織),用于采集、編輯、播放的RIFF檔案。由Microsoft公司1922年11月推出,用于對抗蘋果Quicktime技術,AVI現在還在被廣泛使用。
RIFF:Resource Interchange File Format(資源互動檔案格式),是由Microsoft提出的一種多媒體檔案存儲方式,不同編碼的視訊、音頻檔案按照RIFF儲存,當提取檔案時,可以根據RIFF的規則解析檔案。常見的RIFF檔案有:WAV、AVI等。
RIFF格式是一種樹狀結構,基本組成單元為LIST和CHUNK:LIST相當于目錄,可以包含多個CHUNK或者多個LIST,包含關鍵字“LIST”。CHUNK是資料儲存的基本單元,可用于儲存音視訊資料或者一些參數資訊。RIFF檔案結構最開始4個位元組表示“RIFF”,接着4個位元組表示該檔案的大小,再下來的4個位元組表示該檔案的類型(AVI或者WAV等)。
LIST結構:
- ‘LIST’,一個四字元碼,表示這是一個清單;
- listSize,占用4位元組,記錄了整個清單的大小;
- listType,一個四字元碼,表示本清單的具體類型;
- listData,實際的清單資料。
CHUNK結構:
- ckID,一個表示塊類型的四字元碼;
- ckSize,占用4位元組,記錄了整個塊的大小;
- ckData,實際的塊資料。
AVI是一種最複雜的RIFF檔案,現在常用的AVI檔案有2種:AVI-1, AVI-2。AVI-1中隻包含一個DV資料流,占用較少的存儲空間。AVI-2中通常包含一個視訊流和一個音頻流,隻有一個視訊流或者音頻流也是合法的。
AVI檔案格式:一個AVI RIFF檔案由以下組成:RIFF檔案頭、hdrl清單(AVI檔案的資料格式)、movi清單(AVI的視音頻序列資料),可選索引塊。

* RIFF('AVI' --RIFF檔案頭,塊的資料類型是AVI
* LIST('hdrl' --hdrl清單
* avih(<MainAVIHeader>) --avi子塊開始,本行長度為64位元組
* LIST ('strl' --strl清單,是一個流的清單
* strh(<Stream header>) --流的資訊頭,長度為64位元組
* strf(<Stream format>) --流的格式資訊子塊,描述流中的資料
* .. additional header data --strd可選的額外的頭資訊||strn可選的流的名字
* )
* ...
* )
* LIST('movi' --movi清單塊,包含流的實際資料,可以是子塊,也可以将子塊組織成rec清單
* { LIST('rec' --一個rec清單中的資料應該以此性從磁盤中讀出
* SubChunk...
* )
* | SubChunk } ....
* )
* [ <AVIIndex> ] --索引塊
* )
![]()
avi 檔案格式解析
RIFF('AVI'…)
表明AVI檔案的格式。
hdrl清單嵌套了一系列塊和子清單,一個avih塊,一個或多個strl子清單。avih塊記錄AVI檔案的全局資訊,使用AVIMAINHEADER資料結構來操作: |
typedef struct
{
DWORD dwMicroSecPerFrame; //視訊幀顯示率,ns
DWORD dwMaxBytesPerSec; // 最大資料傳輸率
DWORD dwPaddingGranularity;//記錄塊的長度須為此值的倍數,通常是2048
DWORD dwFlags; // AVI檔案的特殊屬性,包含檔案中的任何标志字。如:有無
//索引塊,是否是interlaced,是否含版權資訊等
DWORD dwTotalFrames; // 資料幀的總數
DWORD dwInitialFrames; // 在開始播放前需要的幀數
DWORD dwStreams; //檔案中包含的資料流種類
DWORD dwSuggestedBufferSize;//建議使用的緩沖區的大小,通常為存儲一陣圖像以
//及同步聲音所需要的資料之和,大于最大的CHUNK的大小
DWORD dwWidth;//圖像寬,像素
DWORD dwHeight; //圖像高,像素
DWORD dwReserved[4];//保留值dwScale,dwRate,dwStart,dwLength
} MainAVIHeader;
![]()
avi 檔案格式解析
strl子清單
一個strl子清單中至少包含一個strh塊和一個strf塊。檔案中有多少個流,就對應有多少個strl子清單,strl子清單在hdrl中的次序就是流的序号。
strh塊說明這個流的頭資訊,長度為64位元組,使用AVISTREAMHEADER資料結構來操作:
|
movi清單
hdrl清單後是movi清單,movi清單中存儲流的實際資料,movi清單中資料子塊的種類有:##db,##dc,##pc,##wb。
##表示資料所屬的流的序号;
db:未壓縮的視訊幀;
dc:壓縮的視訊幀;
wb:音頻資料;
pc;改用新的調色闆。(新的調色闆使用一個資料結構AVIPALCHANGE來定義。如果一個流的調色辦中途可能改變,則應在這個流格式的描述中,也就是AVISTREAMHEADER結構的dwFlags中包含一個AVISF_VIDEO_PALCHANGES标記。)
![]()
avi 檔案格式解析
可選的索引塊
movi清單後是AVI檔案可選的索引塊。這個索引塊對AVI檔案中每一個媒體資料塊進行索引,并且記錄它們在檔案中的偏移(可能相對于‘movi’清單,也可能相對于AVI檔案開頭)。索引塊使用一個四字元碼‘idx1’來表征,索引資訊使用一個資料結構來 AVIOLDINDEX定義:
typedef struct _avioldindex {
FOURCC fcc; // 必須為‘idx1’
DWORD cb; // 本資料結構的大小,不包括最初的8個位元組(fcc和cb兩個域)
struct _avioldindex_entry {
DWORD dwChunkId; // 表征本資料塊的四字元碼
DWORD dwFlags; // 說明本資料塊是不是關鍵幀、是不是‘rec ’清單等資訊
DWORD dwOffset; // 本資料塊在檔案中的偏移量
DWORD dwSize; // 本資料塊的大小
} aIndex[]; // 這是一個數組!為每個媒體資料塊都定義一個索引資訊
} AVIOLDINDEX;
注意:如果一個AVI檔案包含有索引塊,則應在主AVI資訊頭的描述中,也就是AVIMAINHEADER結構的dwFlags中包含一個AVIF_HASINDEX标記。
index flag = 1 表示關鍵幀
更多 0
- 上一篇:MKV 檔案格式解析