AVI RIFF 檔案參考
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
Microsoft AVI 檔案格式是用於擷取、編輯及播放音訊視訊序列之應用程式的 RIFF 檔案規格。 一般而言,AVI 檔案包含不同資料類型的多個資料流程。 大部分 AVI 序列都會使用音訊和視訊串流。 AVI 序列的簡單變化會使用視訊資料,而且不需要音訊資料流程。
本節不會描述 OpenDML AVI 檔案格式副檔名。 如需這些延伸模組的詳細資訊,請參閱 OpenDML AVI 檔案格式延伸模組,由 OpenDML AVI M-JPEG 檔案格式套件發佈。
FOURC
FOURCC (四個字元的程式碼) 是串連四個 ASCII 字元所建立的 32 位不帶正負號的整數。 例如,FOURCC 'abcd' 會在Little-Endian系統上表示為 0x64636261。 FOURC 可以包含空白字元,因此 'abc' 是有效的 FOURCC。 AVI 檔案格式會使用 FOURCC 程式碼來識別資料流程類型、資料區塊、索引項目目和其他資訊。
RIFF 檔案格式
AVI 檔案格式是以 RIFF (資源交換檔案格式) 檔案格式為基礎。 RIFF 檔案是由 RIFF 標頭所組成,後面接著零個或多個 清單 和 區塊。
RIFF 標頭的格式如下:
'RIFF' fileSize fileType (data)
其中 'RIFF' 是常值 FOURCC 程式碼 'RIFF',
fileSize
是 4 位元組值,可提供檔案中的資料大小,而fileType
是識別特定檔案類型的 FOURCC。 的值fileSize
包括 FOURCC 的大小fileType
加上下列資料的大小,但不包含 'RIFF' FOURCC 的大小或 的大小fileSize
。 檔案資料是由區塊和清單所組成,依任何順序。區塊的格式如下:
ckID ckSize ckData
其中
ckID
是四個CC,可識別區塊中包含的資料,是 4 位元組值,ckSize
提供 中ckData
資料的大小,而且ckData
是零個以上的資料位元組。 資料一律會填補到最接近 的 WORD 界限。ckSize
提供區塊中有效資料的大小;不包含填補、大小ckID
或 的大小ckSize
。清單的格式如下:
'LIST' listSize listType listData
其中 'LIST' 是常值 FOURCC 程式碼 'LIST',
listSize
是 4 位元組值,提供清單的大小、listType
是 FOURCC 程式碼,並listData
依任何順序包含區塊或清單。 的值listSize
包含 的大小加上 的大小listType
listData
;它不包含 'LIST' FOURCC 或 的大小listSize
。
本節的其餘部分會使用下列標記法來描述 RIFF 區塊:
ckID ( ckData )
其中區塊大小為隱含。 使用此標記法,清單可以表示為:
'LIST' ( listType ( listData ) )
選擇性元素會放在括弧中: [ optional element ]
AVI RIFF 表單
AVI 檔案是由 RIFF 標頭中的 FOURCC 'AVI' 識別。 所有 AVI 檔案都包含兩個強制 LIST 區塊,分別定義資料流程和資料流程資料的格式。 AVI 檔案也可能包含索引區塊,以提供檔案內資料區塊的位置。 具有這些元件的 AVI 檔案具有下列形式:
RIFF ('AVI '
LIST ('hdrl' ... )
LIST ('movi' ... )
['idx1' (<AVI Index>) ]
)
'hdrl' 清單會定義資料的格式,而且是第一個必要的 LIST 區塊。 'movi' 清單包含 AVI 序列的資料,而且是第二個必要的 LIST 區塊。 'idx1' 清單包含索引。 AVI 檔案必須以適當的順序保留這三個元件。
注意
OpenDML 延伸模組會定義另一種類型的索引,由 FOURCC 'indx' 識別。
'hdrl' 和 'movi' 清單會針對其資料使用 subchunks。 下列範例顯示以完成這些清單所需的區塊展開的 AVI RIFF 表單:
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 主要標頭
'hdrl' 清單開頭為主要 AVI 標頭,其包含在 'avih' 區塊中。 主要標頭包含整個 AVI 檔案的全域資訊,例如檔案內的資料流程數目,以及 AVI 序列的寬度和高度。 主要標頭區塊是由 AVIMAINHEADER 結構所組成。
AVI 資料流程標頭
一或多個 'strl' 清單遵循主要標頭。 每個資料流程都需要 'strl' 清單。 每個 'strl' 清單都包含檔案中一個資料流程的相關資訊,而且必須包含資料流程標頭區塊 ('strh') 和資料流程格式區塊 ('strf') 。 此外,'strl' 清單可能包含資料流程標頭資料區塊 ('strd') 和資料流程名稱區塊 ('strn') 。
資料流程標頭區塊 ('strh') 是由 AVISTREAMHEADER 結構所組成。
資料流程格式區塊 ('strf') 必須遵循資料流程標頭區塊。 資料流程格式區塊描述資料流程中的資料格式。 此區塊中包含的資料取決於資料流程類型。 對於視訊串流,資訊是 BITMAPINFO 結構,包括適當情況下的調色盤資訊。 對於音訊串流,資訊是一種 「波狀結構」 。
如果資料流程標頭資料 ('strd') 區塊存在,則會遵循資料流程格式區塊。 此區塊的格式和內容是由編解碼器驅動程式所定義。 一般而言,驅動程式會使用這項資訊進行設定。 讀取和寫入 AVI 檔案的應用程式不需要解譯此資訊;它們會將其從驅動程式簡單傳輸為記憶體區塊。
選擇性 'strn' 區塊包含描述資料流程的 Null 終止文字字串。
'hdrl' 清單中的資料流程標頭會根據 'strl' 區塊的順序,與 'movi' 清單中的資料流程資料相關聯。 第一個 'strl' 區塊適用于資料流程 0、第二個區塊適用于資料流程 1 等等。
串流資料 ('movi' 清單)
遵循標頭資訊是包含資料流程中實際資料的 'movi' 清單,也就是視訊畫面和音訊範例。 資料區塊可以直接位於 'movi' 清單中,或者它們可能會分組在 'rec' 清單內。 'rec ' grouping 表示群組區塊應該一次從磁片讀取,而且適用于交錯從 CD-ROM 播放的檔案。
識別每個資料區塊的 FOURCC 包含兩位數資料流程編號,後面接著定義區塊中資訊的兩個字元程式碼。
雙字元程式碼 | Description |
---|---|
db | 未壓縮的視訊框架 |
dc | 壓縮的視訊框架 |
pc | 調色盤變更 |
工 務 局 | 音訊資料 |
例如,如果資料流程 0 包含音訊,該資料流程的資料區塊會有 FOURCC '00wb'。 如果資料流程 1 包含影片,該資料流程的資料區塊會有 FOURCC '01db' 或 '01dc'。 視訊資料區塊也可以定義新的調色盤專案,以在 AVI 序列期間更新調色盤。 每個調色盤變更區塊 ('xxpc') 都包含 AVIPALCHANGE 結構。 如果資料流程包含調色盤變更,請在該資料流程之AVISTREAMHEADER結構的dwFlags成員中設定AVISF_VIDEO_PALCHANGES旗標。
文字資料流程可以使用任意的兩個字元代碼。
AVI 索引項目目
-
AVI 1.0 索引
-
選擇性索引 ('idx1') 區塊可以遵循 'movi' 清單。 索引包含資料區塊的清單及其檔案中的位置。 它包含 一個 AVIOLDINDEX 結構,其中包含每個資料區塊的專案,包括 'rec ' 區塊。 如果檔案包含索引,請在AVIMAINHEADER結構的dwFlags成員中設定AVIF_HASINDEX旗標。
-
AVI 2.0 索引
-
AVI 2.0 索引可以顯示為單一區塊。 或者,索引區段可以交錯在 'movi' 區塊內。 如果索引區段放在 'movi' 區塊中,進階索引會包含索引區段的索引。 AVIMETAINDEX結構是索引區段和超級索引的基底結構。 如需詳細資訊,請參閱 OpenDML AVI 檔案格式延伸模組,此延伸模組是由 OpenDML AVI M-JPEG 檔案格式所發行。 (某些語言和國家/地區可能無法使用此資源。)
其他資料區塊
您可以視需要插入 'JUNK' 區塊,在 AVI 檔案中對齊資料。 應用程式應該忽略 'JUNK' 區塊的內容。
相關主題