AVI音視訊封裝格式學習(二)——AVI RIFF檔案參考

li_wen01發表於2018-04-01

AVI RIFF檔案參考 AVI RIFF File Reference

    微軟AVI檔案格式是與捕獲,編輯和播放音視訊流的應用程式一起使用的RIFF檔案規範。通常,AVI檔案包含多個不同型別的資料流。大多數AVI檔案同時使用音訊和視訊流。簡單的AVI檔案只包含視訊資料,不包含音訊資料。

    本節不描述AVI的擴充套件格式(OpenDML AVI file format extensions),有關這些擴充套件的更多資訊,請檢視由OpenDML AVI M-JPEG檔案格式小組委員會發布的《OpenDML AVI File Format Extensions

 

FOURCCs

    FOURCC(四字元程式碼)是通過連線四個ASCII字元建立的一個32位無符號整數。例如,FOURCC值為'abcd',在小端系統上表示為0x64636261。FOURCC可以包含空格字元,所以' abc'是一個有效的FOURCC(注意a前面有個空格),AVI檔案格式使用FOURCC程式碼來標識流型別,資料塊,索引項和其他資訊。

 

RIFF檔案格式(RIFF File Format)

    AVI檔案格式基於RIFF(資源交換檔案格式)檔案格式.每個個RIFF檔案都包含一個RIFF頭(RIFF header ),後面可以跟任意個塊(chunk)和表(list)。

RIFF header有下面的格式:
    'RIFF' fileSize fileType(data)

    其中'RIFF'是字面上的FOURCC程式碼'RIFF',fileSize是一個4位元組的值,用於指定檔案中資料的大小。fileType是一個識別特定檔案型別的FOURCC.fileSize 值得大小等於fileType大小加上後面資料(data)的大小,但是不包含‘RIFF’ 和 fileSize 佔用的大小。 檔案資料可以包含塊(chunk)和表(list),它們可以以任意的順序存放。

塊(chunk)的格式
    ckID ckSize ckData

    其中ckID是一個FOURCC,用於標識塊中包含的資料,ckSize是一個4位元組的值,用於表示ckData中的資料大小,而ckData任意多個位元組的資料(最大4G)。這些資料都是以4位元組對齊的,ckSize的值是ckData中有效資料的大小,不包括填充的資料,也不包括ckID和ckSize佔用的空間(它們兩各佔用4位元組)。

表(list)的格式
    'LIST' listSize listType listData

    其中'LIST'是字面上的FOURCC程式碼'LIST‘,listSize佔用4個位元組表示list的大小,listType是一個FOURCC程式碼,listData包含塊(chunk)和表(list),它們可以以任意順序存放。listSize的大小包括listType佔用的空間(4位元組)加上listData的實際長度,但是不包含字元’LIST‘(4位元組)和listSize(4位元組)的大小。

 

說明

本節的其餘部分使用以下表示法來描述RIFF塊:
    ckID ( ckData )
塊大小是隱含的。 使用這種表示法,列表可以表示為:
    'LIST' ( listType ( listData ) )

可選元素放在括號中:[可選元素]

 

AVI RIFF Form

    AVI檔案由RIFF頭(header)中的FOURCC'AVI'標識。所有的AVI檔案必須包含兩個表(list),一個表(list)用來定義資料流的格式,一個表(list)用來存放資料流的資料。一個AVI檔案可能還包含一個索引表,用來描述資料塊(data chunck)在檔案中的位置。包含這些部分的AVI檔案具有以下格式:

RIFF ('AVI '
	LIST ('hdrl' ... )
	LIST ('movi' ... )
	['idx1' (<AVI Index>) ]
	)

    'hdrl'列表是第一需要的LIST塊,它定義了資料的格式。'movi'是第二個LIST塊,它包含AVI資料流中的資料。idx1表包含索引。AVI檔案必須保證這三個部分的正確順序。

注意:OpenDML extensions 定義了另外的一種索引,它FOURCC的值為'indx'

    'hdrl'和'movi'列表使用子塊來處理他們的資料,下面這個例子展示了用來完善這些表(list)的AVI RIFF 擴充套件塊(chunk)

RIFF ('AVI '
      LIST ('hdrl'
            'avih'(<Main AVI Header>)
            LIST ('strl'
                  'strh'(<Stream header>)
                  'strf'(<Stream format>)
                  [ 'strd'(<Additional header data>) ]
                  [ 'strn'(<Stream name>) ]
                  ...
                 )
             ...
           )
      LIST ('movi'
            {SubChunk | LIST ('rec '
                              SubChunk1
                              SubChunk2
                              ...
                             )
               ...
            }
            ...
           )
      ['idx1' (<AVI Index>) ]
     )

AVI Main Header

    'avih'是hsrl列表的開始,主AVI頭(Main AVI Header)包含在'avih'中。Main AVI Header 中包含整個AVI檔案的全域性資訊,比如流媒體的個數以及AVI中視訊的解析度(寬度和高度)。頭塊( main header chunk)包含一個結構體 AVIMAINHEADER 

 

AVI Stream Headers

    主頭結構(main header.)可以有一個或是多個'strl'列表,每個資料流都需要有'strl'列表與它對應。每個'strl'列表包含檔案中一個流的資訊,並且必須包含一個流頭部塊('strh')和一個流格式塊('strf')另外,'strl'列表可能包含一個流標題資料塊('strd')和一個流名稱塊('strn')。

    流頭部塊('strh')由AVISTREAMHEADER結構組成。

    流格式塊('strf')必須跟在流頭部塊('strh')的後面,流格式塊描述流中資料的格式。包含在該塊中的資料取決於流型別,對於視訊流,'strf'的資訊是一個BITMAPINFO結構,包括調色盤資訊(如果適用)。對於音訊流,'strf'的資訊是WAVEFORMATEX結構。

    如果流頭資料('strd')塊存在,它應該跟在流格式塊('strf')的後面,該塊的格式和內容由編解碼器驅動程式定義。通常,驅動程式使用此資訊進行配置。讀取和寫入AVI檔案的應用程式不需要解釋'strd'裡的資訊,他們簡單地將它作為記憶體塊與驅動程式進行傳輸。

    可選的'strn'塊包含描述流的以空字元結尾的文字字串

    'hdrl'列表中的流頭結構根據'strl'塊的順序與'movi'列表中的流資料相關聯。第一個'strl'塊適用於流0,第二個適用於流1,依此類推。

 

Stream Data ('movi' List)

    跟在頭資訊(hdrl 列表)後面的是'movi'列表,'movi'列表包含資料流中的真實資料——視訊幀和音訊樣本。資料塊可以直接駐留在'movi'列表中,或者可以將它們歸入'rec'列表中。'rec'分組意味著應該一次從磁碟讀取分組塊,適用於交錯式從CD-ROM播放的檔案。

  識別每個資料塊的FOURCC包含一個兩位數字的媒體流號,後跟一個定義該塊中資訊型別的兩字元程式碼。

Two-character code Description
db Uncompressed video frame
dc Compressed video frame
pc Palette change
wb Audio data

 

 

 

 

 

 

 

    例如,如果媒體流0包含音訊,則該流的資料塊的FOURCC值為'00wb'。如果媒體流1包含視訊,則該流的資料塊FOURCC值為'01db'或'01dc'。視訊資料塊也可以定義新的調色盤條目以在AVI序列期間更新調色盤。每個調色盤更改塊('xxpc')都包含一個AVIPALCHANGE結構。如果資料流包含調色盤更改,請在該流的AVISTREAMHEADER結構的dwFlags成員中設定AVISF_VIDEO_PALCHANGES標誌。

    文字流可以使用任意的雙字元程式碼。

 

AVI Index Entries

AVI 1.0 index

    在'movi'列表的後面可以有一個索引('idx1')塊。索引包含資料塊的列表(list)及其在檔案中的位置。它由一個AVIOLDINDEX結構和每個資料塊的條目組成,包括'rec'塊.如果檔案包含索引,請在AVIMAINHEADER結構的dwFlags成員中設定AVIF_HASINDEX標誌。

AVI 2.0 index

 

    AVI 2.0索引可以顯示為一個單獨的塊,或者,索引段可以在'movi'塊內交錯.AVIMETAINDEX結構是索引段和超級索引的基礎結構.有關2.0索引的更多資訊,可以參考由OpenDML AVI M-JPEG問價格式委員會發布的《 OpenDML AVI File Format Extensions》

 

 

Other Data Chunks

    為了AVI檔案資料的對齊,可以根據需要插入'JUNK'塊。應用程式應該忽略“JUNK”塊的內容。

 

 

名字解析:

FOURCC: four-character code. a 32-bit unsigned integer created by concatenating four ASCII characters.

hdrl: The first sub-chunk is identified by the "hdrl" tag. This sub-chunk is the file header and contains metadata about the video, such as its width, height and frame rate. 

movi:The second sub-chunk is identified by the "movi" tag. This chunk contains the actual audio/visual data that make up the AVI movie

idx1:The third optional sub-chunk is identified by the "idx1" tag which indexes the offsets of the data chunks within the file.

strh: stream header chunk

strn: stream name chunk 

strf: stream format chunk

strd: stream-header data 

      

 

 計劃該系列文章包括下面幾篇:

           AVI音視訊封裝格式學習(一)——微軟RIFF檔案格式摘要

           AVI音視訊封裝格式學習(二)——AVI RIFF檔案參考

           AVI音視訊封裝格式學習(三)——AVI 資料結構解析

           AVI音視訊封裝格式學習(四)——linux系統C語言AVI格式音視訊封裝應用

                            

                                                                                                                  Wen Lee

                                                                                                                 2018.04.01 

 

相關文章