AVI音視訊封裝格式學習(二)——AVI RIFF檔案參考
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音視訊封裝格式學習(四)——linux系統C語言AVI格式音視訊封裝應用
Wen Lee
2018.04.01
相關文章
- 5-AVI–Fragment簡單封裝Fragment封裝
- 如何裁剪AVI檔案呢?
- Win10系統怎麼播放AVI格式檔案_win10如何使用自帶播放器播放avi格式檔案Win10播放器
- 碎片化學習之–10分鐘學會Jave視訊轉碼avi–>mp4(h264編碼格式)!
- AVI影片工具: AVItools for MacMac
- 1-AVI–Fragment基礎使用Fragment
- 如何給視訊格式的檔案進行格式轉換 可以轉為音訊格式嗎?音訊
- openGauss 配置檔案參考
- axios二次封裝學習iOS封裝
- 自動將視訊檔案轉換成音訊檔案,mp4轉mp3格式音訊
- 音視訊學習路線
- 3-AVI–Activity與Fragment的資料傳遞Fragment
- Android 音視訊開發 視訊編碼,音訊編碼格式Android音訊
- Pro Audio Converter for Mac(音訊檔案格式轉換器)Mac音訊
- 傳媒系學生分享自用的avi轉mp4方法
- Vue學習(四)元件(參考)Vue元件
- APEX學習資料參考
- ai學習參考路線AI
- VMware Avi Load Balancer 30.2.2 釋出下載,新增功能概覽
- IOS音視訊(二)AVFoundation視訊捕捉iOS
- 神經網路學習參考神經網路
- Java學習-封裝Java封裝
- js實現封裝MP4格式檔案並下載JS封裝
- 音視訊格式轉換器Permute 3
- 風雲音訊處理大師提取視訊中的音訊檔案的方法音訊
- Java 在Word中嵌入多媒體(視訊、音訊)檔案Java音訊
- vue學習資源(參考連結)Vue
- 嵌入式學習參考資料
- 音視訊開發-全網最全常用音視訊編碼和格式彙總
- 參考基因組與VCF檔案contigs不匹配
- MT6739+MT6357音訊設計資料參考音訊
- Flutter視訊播放封裝歷程Flutter封裝
- 安裝Ubunutu音訊視訊庫音訊
- android音視訊指南-支援的媒體格式Android
- 音視訊格式轉換器Permute 3 macMac
- java自己封裝檔案處理Java封裝
- Movavi Video Converter 2022 Premium for Mac(視訊音訊檔案轉換器)IDEREMMac音訊
- 微信下載錄音檔案(音軌分離 ffmpeg視訊合成)