AVI RIFF ファイルのリファレンス

Microsoft AVI ファイル フォーマットは、オーディオ/ビデオ シーケンスのキャプチャ、編集、再生を行うアプリケーションで使われる RIFF ファイル仕様である。一般に、AVI ファイルには異なる種類のデータのストリームが複数含まれる。ほとんどの AVI シーケンスは、オーディオ ストリームとビデオ ストリームの両方を使う。単純な AVI シーケンスでは、ビデオ データのみを使い、オーディオ ストリームは必要としない。

ここでは、OpenDML AVI ファイル フォーマット エクステンションについては説明しない。これらの拡張の詳細については、『OpenDML AVI File Format Extensions』(OpenDML AVI M-JPEG File Format Subcommittee 編) を参照すること。

FOURCC

FOURCC (4 文字コード) とは、4 つの ASCII 文字を連結して作成した 32 ビットの符号なし整数である。たとえば、FOURCC の 'abcd' は、リトル エンディアン システムでは 0x64636261 と表される。FOURCC では空白文字を含めることができるので、' abc' は有効な FOURCC である。AVI ファイル フォーマットは FOURCC コードを使って、ストリーム タイプ、データ チャンク、インデックス エントリ、その他の情報を識別する。

RIFF ファイル フォーマット

AVI ファイル フォーマットは、RIFF (resource interchange file format) ドキュメント フォーマットに基づいている。RIFF ファイルは、RIFF ヘッダーとその後ろに続く 0 個以上のリストチャンクで構成されている。

  • RIFF ヘッダーは、次のようなフォーマットを持つ。

    'RIFF' fileSize fileType (data)

    ここで、'RIFF' はリテラルの FOURCC コード 'RIFF'、fileSize はファイル内のデータ サイズを示す 4 バイト値、fileType は特定のファイル タイプを示す FOURCC である。fileSize の値には、fileType FOURCC のサイズとその後に続くデータのサイズを加えた値は含まれるが、'RIFF' FOURCC のサイズや fileSize のサイズは含まれない。ファイル データは、任意の順序のチャンクとリストで構成されている。

  • チャンクは、次のようなフォーマットを持つ。

    ckID ckSize ckData

    ここで、ckID はチャンクに含まれるデータを識別する FOURCC、ckSize は ckData 内のデータ サイズを指定する 4 バイトの値、ckData は 0 バイト以上のデータである。データは常に最も近い WORD 境界まで追加される。ckSize はチャンク内の有効なデータ サイズを指定するが、パディング、ckID のサイズ、ckSize のサイズは含まない。

  • リストは、次のようなフォーマットを持つ。

    'LIST' listSize listType listData

    ここで、'LIST' はリテラルの FOURCC コード 'LIST'、listSize はリスト サイズを指定する 4 バイト値、listType は FOURCC コード、listData は任意の順序のチャンクやリストで構成されている。listSize の値には、listType に listData のサイズを加えた値は含まれるが、'RIFF' FOURCC や fileSize のサイズは含まれない。

説明の後半では、次の表記を使って RIFF チャンクを記述する。

ckID ( ckData )

ここで、チャンク サイズは非明示である。この表記を使って、リストは次のように表される。

'LIST' ( listType ( listData ) )

オプションの要素は、かっこで囲まれる。[ optional element ]

AVI RIFF フォーマット

AVI ファイルは、RIFF ヘッダー内の FOURCC 'AVI ' によって識別される。すべての AVI ファイルには、2 つの必須の LIST チャンクが含まれており、それぞれがストリームとストリーム データのフォーマットを定義している。AVI ファイルにはインデックス チャンクが含まれる場合もある。インデックス チャンクはファイル内でのデータ チャンクの位置を指定する。これらの要素を含んだ AVI ファイルは、次のようなフォーマットを持つ。

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

'hdrl' リストはデータのフォーマットを定義し、これは最初の必須 LIST チャンクである。'movi' リストは AVI シーケンスのデータを含み、これは 2 番目の必須 LIST チャンクである。'idx1' リストには、インデックスが含まれている。AVI ファイルは、この 3 つのコンポーネントを適切な順序で含む必要がある。

   OpenDML 拡張は、FOURCC 'indx' で識別される別のタイプのインデックスを定義する。

'hdrl' リストおよび 'movi' リストは、そのデータに対してサブチャンクを使う。次の例で、これらのリストを完成させるのに必要なチャンクを追加した 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 ストリーム ヘッダー

メイン ヘッダーの次には、1 つ以上の 'strl' リストが続く。'strl' リストは各データ ストリームごとに必要である。各 'strl' リストには、ファイル内の単一のストリームに関する情報が含まれ、ストリーム ヘッダー チャンク ('strh') とストリーム フォーマット チャンク ('strf') が必ず含まれる。さらに、'strl' リストには、ストリーム ヘッダー データ チャンク ('strd') とストリーム名チャンク ('strn') が含まれる場合がある。

ストリーム ヘッダー チャンク ('strh') は、AVISTREAMHEADER 構造体で構成されている。

ストリーム フォーマット チャンク ('strf') は、ストリーム ヘッダー チャンクの後に続けて記述する必要がある。ストリーム フォーマット チャンクは、ストリーム内のデータのフォーマットを記述する。このチャンクに含まれるデータは、ストリーム タイプによって異なる。ビデオ ストリームの場合、この情報は必要に応じてパレット情報を含む BITMAPINFO 構造体である。オーディオ ストリームの場合、この情報は WAVEFORMATEX 構造体である。

ストリーム ヘッダー データ ('strd') チャンクが存在する場合、このチャンクはストリーム フォーマット チャンクの後ろに続く。このチャンクのフォーマットと内容は、CODEC ドライバによって定義される。通常、ドライバはこの情報を構成に使う。AVI ファイルを読み書きするアプリケーションは、この情報を解釈する必要はない。メモリ ブロックとしてドライバとの間で単に情報をやり取りするだけである。

オプションの 'strn' チャンクには、ストリームを記述する NULL で終わるテキスト文字列が含まれている。

'hdrl' リスト内のストリーム ヘッダーは、'strl' チャンクの順序に従って 'movi' リスト内のストリーム データと関連付けられる。最初の 'strl' チャンクはストリーム 0 に対応し、2 番目のチャンクはストリーム 1 に対応し、以下同様に続く。

ストリーム データ ('movi' リスト)

ヘッダー情報の次に続くのは、ストリーム内の実際のデータ、すなわち、ビデオ フレームおよびオーディオ サンプルを含む 'movi' リストである。データ チャンクは 'movi' リスト内に直接記述する場合と、'rec ' にグループ化する場合がある。'rec ' のグループ化は、グループ化したチャンクは一度に読み取る必要があることを意味し、CD-ROM から再生するためにインターリーブされたファイルの場合にだけ使われる。

各データ チャンクを識別する FOURCC は、2 桁のストリーム番号とその後に続く、チャンク内の情報の種類を定義する 2 文字コードで構成されている。

2 文字コード 説明
db 非圧縮ビデオ フレーム
dc 圧縮ビデオ フレーム
pc パレットの変更
wb オーディオ データ

たとえば、ストリーム 0 にオーディオが含まれる場合、そのストリームのデータ チャンクは FOURCC '00wb' を持つ。ストリーム 1 にビデオが含まれる場合、そのストリームのデータ チャンクは FOURCC '01db' または '01dc' を持つ。ビデオ データ チャンクは、新しいパレット エントリも定義して、AVI シーケンスでパレットを更新する。各パレットの変更チャンク ('xxpc') には、AVIPALCHANGE 構造体が含まれている。ストリームにパレットの変更が含まれる場合、そのストリームに対して、AVISTREAMHEADER 構造体の dwFlags メンバの AVISF_VIDEO_PALCHANGES フラグを設定する。

テキスト ストリームは、任意の 2 文字コードを使える。

AVI インデックス エントリ

オプションのインデックス ('idx1') チャンクは、'movi' リストの次に記述できる。インデックスには、データ チャンクのリストとファイル内でのその位置が含まれている。インデックスは、AVIOLDINDEX 構造体で構成され、'rec ' チャンクを含む、各データ チャンクのエントリが含まれている。ファイルにインデックスが含まれる場合、AVIMAINHEADER 構造体の dwFlags メンバにある AVIF_HASINDEX フラグを設定する。

その他のデータ チャンク

データは、必要に応じて 'JUNK' チャンクを挿入して、AVI ファイルに整列させることができる。アプリケーションは、'JUNK' チャンクの内容を無視する必要がある。

参照