共用方式為


AVI RIFF 檔案參考

[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 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 包含 的大小加上 的大小 listTypelistData ;它不包含 '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' 區塊的內容。

AVI 檔案格式