天天看點

avi 檔案格式解析

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結構:

  1. ‘LIST’,一個四字元碼,表示這是一個清單;
  2. listSize,占用4位元組,記錄了整個清單的大小;
  3. listType,一個四字元碼,表示本清單的具體類型;
  4. listData,實際的清單資料。

CHUNK結構:

  1. ckID,一個表示塊類型的四字元碼;
  2. ckSize,占用4位元組,記錄了整個塊的大小;
  3. ckData,實際的塊資料。

AVI是一種最複雜的RIFF檔案,現在常用的AVI檔案有2種:AVI-1, AVI-2。AVI-1中隻包含一個DV資料流,占用較少的存儲空間。AVI-2中通常包含一個視訊流和一個音頻流,隻有一個視訊流或者音頻流也是合法的。

AVI檔案格式:一個AVI RIFF檔案由以下組成:RIFF檔案頭、hdrl清單(AVI檔案的資料格式)、movi清單(AVI的視音頻序列資料),可選索引塊。

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檔案的格式。

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資料結構來操作:

typedef struct {

    FOURCC            fccType;//4個字元,若此流是視訊資料,為“vids”,若是音頻資料,為

//“auds”

    FOURCC           fccHandler;  //4個字元,描述資料所用編解碼算法

    DWORD             dwFlags;  //資料流的屬性

    WORD              wPriority;  //此資料流播放的優先級别

    WORD              wLanguage;  //音頻的語言代号

    DWORD             dwInitialFrames;  //用于interlaced檔案,開始播放前所需幀數

    DWORD             dwScale;   //資料量,視訊每幀的大小或者音頻的采樣大小

    DWORD             dwRate;    //dwRate / dwScale = =samples/second(每秒采樣數)

    DWORD             dwStart;  //資料流開始播放的位置,機關:dwScale

    DWORD             dwLength;   //資料流的資料量,機關:dwScale

    DWORD             dwSuggestedBufferSize;  //建議緩沖區的大小

    DWORD             dwQuality;  //解壓縮品質參數,值越大,品質越好(0~10000)

    DWORD             dwSampleSize;  //音頻的采樣大小

    RECT              rcFrame;  //視訊資料圖像所占的矩形。即這個流在視訊主視窗顯示的位置。

}AVIStreamHeader;

avi 檔案格式解析
avi 檔案格式解析

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  表示關鍵幀

avi 檔案格式解析

更多 0

  • 上一篇:MKV 檔案格式解析