Microsoft DirectX 8.0

AVI ファイル フォーマットの DV データ

Microsoft はデジタル ビデオ (DV) データを AVI ファイルに保存するためのフォーマットを指定している。この仕様に従うことで、このフォーマットで作成された AVI ファイルは Microsoft® Windows® プラットフォーム用の Microsoft® DirectShow® デジタル ビデオ アーキテクチャの将来のバージョンに対して互換性を持つことが保証される。

このトピックでは、DV オーディオおよびビデオ データを含む AVI (Audio-Video Interleaved) ファイルのフォーマットを理解するための背景情報を提供する。また、他のプラットフォーム上で DV-AVI ファイルを使用するプログラマのための情報も提供する。AVI ファイルを読み書きするアプリケーションは、ファイル ソース (Async) フィルタと AVI スプリッタ フィルタ、および AVI Mux フィルタと ファイル ライタ フィルタ、そして DirectShow アーキテクチャで提供される関連インターフェイスを使用する。それにより、それらのサービスを実行するためのルーチンを開発しなくて済む。これらのフィルタは、AVI ファイルにアクセスするためのプログラミング上の要件を単純化する。

ここではさらに、DV データを含む AVI ファイルのフォーマットについても説明する。インターリーブされた DV データ ストリームおよび DV コンプレッサ/デコンプレッサ ストリーム ハンドラ用の特定の FOURCC (4 文字コード) を定義し、DV データのストリーム フォーマット構造体を定義する。また、AVI ファイル フォーマットに DV データを格納するための 2 つの方法の仕様についても説明する。

このトピックは、読者が DV データ フォーマットについてある程度理解していることを前提として書かれている。(このフォーマットについては、『Specification of Consumer-use Digital VCRs』に定義されている。この文書は Blue Book とも呼ばれる。)

このトピックは、以下のセクションを含んでいる。

RIFF (Resource Interchange File Format) ファイルの詳細については、Windows Software Development Kit (SDK) の 『Multimedia Programmer's Guide』と『Multimedia Programmer's Reference』を参照すること。

AVI ファイルの詳細については、Microsoft Video for Windows Development Kit バージョン 1.1 の『Programmer's Guide』第 6 章、および『OpenDML AVI File Format Extensions』(OpenDML AVI M-JPEG File Format Subcommittee 編、1996 年 2 月 28 日) のバージョン 1.02 を参照すること。

コンプレッサおよびデコンプレッサの詳細については、MSDN ライブラリにある Windows DDK Documentation の「Video Compression and Decompression Drivers」セクションを参照すること。

DV AVI ファイルのタイプ

DV AVI ファイルには次の 2 つのタイプがある。

1 つの DV データ ストリームを含む AVI ファイル

インターリーブされた DV データは、AVI RIFF ファイル内に 1 つのストリームとしてそのネイティブ フォーマットで格納できる。この方法には、DV に対して使用するデータ格納領域の量が最小限で済むという利点がある。主な欠点としては、このファイル フォーマットにはビデオ 'vids' ストリームもオーディオ 'auds' ストリームも含まれないため、Video for Windows に対する後方互換性を持たないことが挙げられる。インターリーブされた DV ストリームのサポートは、DirectShow の DV Muxer および DV スプリッタ フィルタによって提供される。

DV データを AVI RIFF ファイル内に 1 つのストリームとして格納するには、'strh' ストリーム ヘッダー チャンクの fccType メンバに 'iavs' (interleaved audio and video stream) FOURCC (four-character code : 4 文字コード) を指定し、fccHandler メンバに 'dvsd'、'dvhd'、'dvsl' のいずれかの FOURCC を指定する。ビデオ ストリームの毎秒のフレーム数を dwRate および dwScale メンバに指定し、'movi' チャンク内のビデオ ブロックの総数を dwLength メンバに指定する。

'dvsd' ストリーム ハンドラ FOURCC は、DV データが『Specification of Consumer-use Digital VCRs』の Part 2 に従っていることを指定する。ビデオのフォーマットは 525 ライン、29.97 Hz (525-60) か、または 625 ライン、25.00 Hz (625-50) である。

'dvhd' ストリーム ハンドラ FOURCC は、DV データが『Specification of Consumer-use Digital VCRs』の Part 3 に従っていることを指定する。ビデオのフォーマットは 1125 ライン、30.00 Hz (1125-60) か、または 1250 ライン、25.00 Hz (1250-50) である。

'dvsl' ストリーム ハンドラ FOURCC は、DV データが『Specification of Consumer-use Digital VCRs』の Part 6 に従っていることを指定する。ビデオのフォーマットは高圧縮 SD (SDL) である。

注 :  このトピックの以降の部分では、'dvsd' ストリームの定義を提供する。

ストリーム ヘッダー チャンクの後には、DVINFO ストリーム フォーマット チャンクが続く。DVINFO ストリーム フォーマットに対しては、以下のデータ構造体が定義される。

typedef struct tag_DVINFO {
    DWORD dwDVAAuxSrc;
    DWORD dwDVAAuxCtl;
    DWORD dwDVAAuxSrc1;
    DWORD dwDVAAuxCtl1;
    DWORD dwDVVAuxSrc;
    DWORD dwDVVAuxCtl;
    DWORD dwDVReserved[2];
} DVINFO, *PDVINFO;
dwDVAAuxSrc
フレームの最初のオーディオ ブロック (525-60 システムでは最初の 5 つの DV DIF シーケンス、625-50 システムでは最初の 6 つの DV DIF シーケンス) に対する Audio Auxiliary Data Source Pack を指定する。DIF シーケンスは、150 個の DIF ブロックを含むデータ ブロックである。各 DIF ブロックには 80 バイトが含まれる。Audio Auxiliary Data Source Pack については、『Specification of Consumer-use Digital VCRs』の Part 2、Annex D「The Pack Header Table and Contents of Packs」のセクション D.7.1 に定義されている。
dwDVAAuxCtl
フレームの最初のオーディオ ブロックの Audio Auxiliary Data Source Control Pack を指定する。Audio Auxiliary Data Control Pack については、『Specification of Consumer-use Digital VCRs』の Part 2、Annex D「The Pack Header Table and Contents of Packs」のセクション D.7.2 に定義されている。
dwDVAAuxSrc1
フレームの 2 番目のオーディオ ブロック (525-60 システムでは 2 番目の 5 つの DV DIF シーケンス、625-50 システムでは 2 番目の 6 つの DV DIF シーケンス) に対する Audio Auxiliary Data Source Pack を指定する。
dwDVAAuxCtl1
フレームの 2 番目のオーディオ ブロックの Audio Auxiliary Data Source Control Pack を指定する。
dwDVVAuxSrc
『Specification of Consumer-use Digital VCRs』の Part 2、Annex D「The Pack Header Table and Contents of Packs」のセクション D.8.1 に定義されている Video Auxiliary Data Source Pack を指定する。
dwDVVAuxCtl
『Specification of Consumer-use Digital VCRs』の Part 2、Annex D「The Pack Header Table and Contents of Packs」のセクション D.8.2 に定義されている Video Auxiliary Data Source Control Pack を指定する。
DwDVReserved[2]
予約されている。この配列はゼロに設定する。

実際の DV データは 'movi' チャンク内の '##dc' チャンクとして格納される (## はストリーム識別子)。各チャンクには、1 フレームのデータが含まれる。これは 525-60 システムの場合は 10 個の DV DIF シーケンス、625-50 システムの場合は 12 個の DV DIF シーケンスである。DV SD ('dvsd') DIF シーケンス フォーマットについては、『Specification of Consumer-use Digital VCRs』の Part 2 で定義されている。

次の図に、1 つの DV データ ストリームを含む AVI ファイルを DirectShow フィルタ グラフを使用して再生する例を示す (DV スプリッタおよび DV ビデオ デコーダ フィルタは、特に DV データを扱うために DirectShow に用意されている)。下の表で、メディア タイプを定義する。

1 つの DV データ ストリームを含む AVI ファイルの再生
メディアメジャー タイプサブタイプフォーマット構造体
A MEDIATYPE_Stream MEDIASUBTYPE_AVI なし
B MEDIATYPE_iavs MEDIASUBTYPE_dvsd、MEDIASUBTYPE_dvhd、または MEDIASUBTYPE_dvsl DVINFO
C MEDIATYPE_VIDEO MEDIASUBTYPE_dvsd、MEDIASUBTYPE_dvhd、または MEDIASUBTYPE_dvsl DVINFO
D MEDIATYPE_AUDIO NULL WAVEFORMATEX
E MEDIATYPE_VIDEO 標準ビデオ タイプ VIDEOINFO

次の図に、1 つの DV データ ストリームを含む AVI ファイルを DirectShow フィルタ グラフを使用して作成する例を示す (DV ビデオ エンコーダ および DV Muxer フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは上の表に定義されている。アップストリーム フィルタは、ここには示されていないが、適切なメディア タイプ D および E を生成する任意の組み合わせを使用できる。

1 つの DV データ ストリームを含む AVI ファイルの作成

次の図に、1 つの DV データ ストリームを含む AVI ファイルを DirectShow フィルタ グラフを使用して作成する例を示す。ここでは、ハードウェア デバイス ドライバを通して DV デバイス (1394 ベースの DV カムコーダなど) と通信するソース フィルタを DV データ入力として使用している (このソース フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは上の表に定義されている。

1 つの DV データ ストリームを含む AVI ファイルへの DV キャプチャ

次の図に、1 つの DV データ ストリームを含む AVI ファイルを DirectShow フィルタ グラフを使用して出力する例を示す。ここでは、ハードウェア デバイス ドライバを通して DV デバイス (1394 ベースの DV カムコーダなど) と通信するシンク フィルタを DV データ出力として使用している (このシンク フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは上の表に定義されている。

1 つの DV データ ストリームを含む AVI ファイルの出力

次の例は、完全なヘッダー チャンクによって拡張された、1 つの DV データ ストリームを含む AVI ファイルの AIFF RIFF フォーマットを示す。

00000000 RIFF (0FAE35D4) 'AVI '
0000000C LIST (00000106) 'hdrl'
00000018 avih (00000038)
dwMicroSecPerFrame    : 33367
dwMaxBytesPerSec      : 3728000
dwPaddingGranularity  : 0
dwFlags               :0x810 HASINDEX | TRUSTCKTYPE
dwTotalFrames         : 2192
dwInitialFrames       : 0
dwStreams             : 1
dwSuggestedBufferSize : 120000
dwWidth               : 720
dwHeight              : 480
dwReserved            :0x0
00000058         LIST (0000006C) 'strl'
00000064             strh (00000038)
fccType               : 'iavs'
fccHandler            :'dvsd'
dwFlags               :0x0
wPriority             : 0
wLanguage             :0x0 undefined
dwInitialFrames       : 0
dwScale               :100 (29.970 Frames/Sec)
dwRate                : 2997
dwStart               : 0
dwLength              : 2192
dwSuggestedBufferSize : 120000
dwQuality             : 0
dwSampleSize          : 0
rcFrame               : 0,0,720,480
000000A4             strf (00000020)
dwDVAAuxSrc     :0x........
dwDVAAuxCtl     :0x........
dwDVAAuxSrc1    :0x........
dwDVAAuxCtl1    :0x........
dwDVVAuxSrc     :0x........
dwDVVAuxCtl     :0x........
dwDVReserved[2] : 0,0
000000CC     LIST (0FADAC00) 'movi'
0FADACD4     idx1 (00008900)

DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイル

インターリーブされた DV データは、AVI RIFF ファイル内で 1 つのビデオ ストリームと 1 つから 4 つまでのオーディオ ストリームに分割することができる。このファイル フォーマットには標準ビデオ 'vids' ストリームと少なくとも 1 つの標準オーディオ 'auds' ストリームが含まれるため、Video for Windows に対して後方互換性を持つという利点がある。主な欠点は、このファイル フォーマットではオーディオ データをオーディオ ストリームとして冗長に格納しなければならないことである。"ビデオ" ストリームは、実際にはネイティブのインターリーブされた DV データ ストリームである。ただし、ハンドラ タイプ 'dvsd' の標準 'vids' ストリームとして、DV ビデオ デコーダが使用される。また、このフォーマットでは、"キャプチャされた" ファイルを AVI ファイルとして書き込む前に、DV スプリッタ フィルタを使用してファイルを分割する必要がある。

DV データは、1 つのビデオ ストリームと、別にいくつかのオーディオ ストリームとして AVI RIFF ファイルに格納できる。ビデオ ストリームは標準ビデオ ストリーム ヘッダー (fccType メンバ値が 'vids') によって指定される。fccHandler メンバは 'dvsd'、'dvhd'、または 'dvsl' として指定される。ビデオ ストリームの毎秒のフレーム数を dwRate および dwScale メンバに指定し、'movi' チャンク内のビデオ ブロックの総数を dwLength メンバに指定する。

このように DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリーム フォーマットの DV として含む AVI ファイルでは、ビデオ ストリーム フォーマット チャンクは標準の BITMAPINFOHEADER 構造体である。ストリーム フォーマット チャンクは、オプションで DVINFO 構造体を含むように拡張できる。その場合は、ストリーム フォーマット チャンクのサイズを 40 バイト (BITMAPINFOHEADER 構造体のサイズ) から 72 バイト (BITMAPINFOHEADERDVINFO 構造体のサイズ) に変更し、BITMAPINFOHEADER データ構造体の直後に DVINFO データ構造体を記述する。

オーディオ ストリームは標準オーディオ ストリーム ヘッダー (fccType メンバ値が 'auds') によって指定される。fccHandler メンバは、オーディオ ストリームでは使用しない。

DV ビデオ データは、前の「1 つの DV データ ストリームを含む AVI ファイル」で説明したとおり、'##dc' チャンクとして格納される。オーディオ データは、'##wb' チャンクとして 'movi' チャンクに格納される。

次の図に、DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルを DirectShow フィルタ グラフを使用して再生する例を示す (DV ビデオ デコーダ フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは、DV メディア タイプの表に定義されている。

DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルの再生

次の図に、DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルを DirectShow フィルタ グラフを使用して作成する例を示す (DV ビデオ デコーダは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは、DV メディア タイプの表に定義されている。アップストリーム フィルタは、ここには示されていないが、適切なメディア タイプ D および E を生成する任意の組み合わせを使用できる。

DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルの作成

次の図に、DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルを DirectShow フィルタ グラフを使用して作成する例を示す。ここでは、ハードウェア デバイス ドライバを通して DV デバイス (1394 ベースの DV カムコーダなど) と通信するソース フィルタを DV データ入力として使用している (このソース フィルタと DV スプリッタ フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは、DV メディア タイプの表に定義されている。

DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルへの DV キャプチャ

次の図に、DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルを DirectShow フィルタ グラフを使用して出力する例を示す。ここでは、ハードウェア デバイス ドライバを通して DV デバイス (1394 ベースの DV カムコーダなど) と通信するシンク フィルタを DV データ出力として使用している (このシンク フィルタと DV Muxer フィルタは、特に DV データを扱うために DirectShow に用意されている)。メディア タイプは、DV メディア タイプの表に定義されている。

DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルの出力

次の例は、完全なヘッダー チャンクによって拡張された、DV ビデオを 'vids' ストリームとして含み DV オーディオを 'auds' ストリームとして含む AVI ファイルの AIFF RIFF フォーマットを示す ('vids' ストリームの 'strf' サブチャンクにおいて、BITMAPINFO の後にオプションで DVINFO データが記述されている)。

00000000 RIFF (103E2920) 'AVI '
0000000C LIST (00000146) 'hdrl'
00000018 avih (00000038)
dwMicroSecPerFrame    : 33367
dwMaxBytesPerSec      : 3728000
dwPaddingGranularity  : 0
dwFlags               :0x810 HASINDEX | TRUSTCKTYPE
dwTotalFrames         : 2192
dwInitialFrames       : 0
dwStreams             : 2
dwSuggestedBufferSize : 120000
dwWidth               : 720
dwHeight              : 480
dwReserved            :0x0
00000058         LIST (00000094) 'strl'
00000064             strh (00000038)
fccType               :'vids'
fccHandler            :'dvsd'
dwFlags               :0x0
wPriority             : 0
wLanguage             :0x0 undefined
dwInitialFrames       : 0
dwScale               :100 (29.970 Frames/Sec)
dwRate                : 2997
dwStart               : 0
dwLength              : 2192
dwSuggestedBufferSize : 120000
dwQuality             : 0
dwSampleSize          : 0
rcFrame               : 0,0,720,480
000000A4             strf (00000048)
                         biSize          : 40
                         biWidth         : 720
                         biHeight        : 480
                         biPlanes        : 1
                         biBitCount      : 24
                         biCompression   : 0x64737664 'dvsd'
                         biSizeImage     : 120000
                         biXPelsPerMeter : 0
                         biYPelsPerMeter : 0
                         biClrUsed       : 0
                         biClrImportant  : 0
dwDVAAuxSrc     :0x........
dwDVAAuxCtl     :0x........
dwDVAAuxSrc1    :0x........
dwDVAAuxCtl1    :0x........
dwDVVAuxSrc     :0x........
dwDVVAuxCtl     :0x........
dwDVReserved[2] : 0,0
000000F4         LIST (0000005E) 'strl'
00000100             strh (00000038)
fccType               :'auds'
fccHandler            : '    '
dwFlags               :0x0
wPriority             : 0
wLanguage             :0x0 undefined
dwInitialFrames       : 0
dwScale               : 1 (32000.000 Samples/Sec)
dwRate                : 32000
dwStart               : 0
dwLength              : 2340474
dwSuggestedBufferSize : 4272
dwQuality             : 0
dwSampleSize          : 4
rcFrame               : 0,0,0,0
00000140             strf (00000012)
                         wFormatTag      : 1 PCM
                         nChannels       : 2
                         nSamplesPerSec  : 32000
                         nAvgBytesPerSec : 128000
                         nBlockAlign     : 4
                         wBitsPerSample  : 16
                         cbSize          : 0
00000814     LIST (103D0EF4) 'movi'
103D1710     idx1 (00011210)

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

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

元々の AVI ファイル仕様に対して OpenDML AVI File Format Extensions で加えられた変更については、このセクションでは取り上げない。詳細については、『OpenDML AVI File Format Extensions』(OpenDML AVI M-JPEG File Format Subcommittee 編、1996 年 2 月 28 日) のバージョン 1.02 を参照すること。

このセクションには、以下の内容が含まれる。

AVI RIFF フォーマット

AVI ファイルは、AVI RIFF フォーマットを使用する。AVI RIFF フォーマットは、FOURCC (4 文字コード) 'AVI ' によって識別される。すべての AVI ファイルには、2 つの必須の LIST チャンクが含まれる。これらのチャンクは、ストリームとストリーム データのフォーマットを定義する。AVI ファイルには、インデックス チャンクが含まれる場合もある。このオプションのチャンクは、ファイル内でのデータ チャンクの位置を指定する。これらの要素を含んだ AVI ファイルは、次のようなフォーマットを持つ。

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

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

LIST 'hdrl' および LIST 'movi' チャンクは、そのデータに対してサブチャンクを使用する。次の例に、LIST 'hdrl' および LIST '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 メイン ヘッダー

以降のセクションでは、LIST 'hdrl' および LIST 'movi' チャンクに含まれるチャンクについて説明する。'idx1' チャンクについては、このドキュメントでは説明しない。AVI ファイルの 'idx1' チャンクおよびインデックスの詳細については、『OpenDML AVI File Format Extensions』(OpenDML AVI M-JPEG File Format Subcommittee 編、1996 年 2 月 28 日) のバージョン 1.02 を参照すること。

ファイルはメイン ヘッダーで始まる。AVI ファイルの場合、このヘッダーは 'avih' という FOURCC (4 文字コード) で示される。ヘッダーには、ファイル内のストリーム数、AVI シーケンスの幅と高さなど、AVI ファイル全体に関するグローバル情報が含まれる。AVI メイン ヘッダー構造体は、次のように定義される。

typedef struct {
    DWORD dwMicroSecPerFrame;
    DWORD dwMaxBytesPerSec;
    DWORD dwReserved1;
    DWORD dwFlags;
    DWORD dwTotalFrames;
    DWORD dwInitialFrames;
    DWORD dwStreams;
    DWORD dwSuggestedBufferSize;
    DWORD dwWidth;
    DWORD dwHeight;
    DWORD dwReserved[4];
} MainAVIHeader;
dwMicroSecPerFrame
フレーム間の間隔をマイクロ秒単位で指定する。この値はファイルの全体のタイミングを示す。
dwMaxBytesPerSec
ファイルの概算最大データ レートを指定する。この値は、メイン ヘッダーおよびストリーム ヘッダー チャンクに含まれる他のパラメータに従って AVI シーケンスを表示するために、システムが処理しなければならない毎秒のバイト数を示す。
dwReserved1
予約されている。ゼロに設定すること。
dwFlags
ファイルに対するフラグを含む。以下のフラグが定義されている。
AVIF_HASINDEXAVI ファイルの終わりにインデックスを含む 'idx1' チャンクがあることを示す。良好なパフォーマンスのためには、すべての AVI ファイルがインデックスを含む必要がある。
AVIF_MUSTUSEINDEXデータのプレゼンテーションの順序を決定するために、ファイル内のチャンクの物理的な順序ではなく、インデックスを使用することを示す。たとえば、これを使ってフレームのリストを作成して編集することができる。
AVIF_ISINTERLEAVEDAVI ファイルがインターリーブされていることを示す。
AVIF_WASCAPTUREFILEAVI ファイルが、リアルタイム ビデオのキャプチャ用に特別に割り当てられたファイルであることを示す。アプリケーションは、このフラグが設定されたファイルをオーバーライドする前に、ユーザーに警告を発する必要がある。これは、ユーザーがこのファイルをデフラグメントしている可能性が高いからである。
AVIF_COPYRIGHTEDAVI ファイルに著作権のあるデータおよびソフトウェアが含まれていることを示す。このフラグが使用されている場合、ソフトウェアはデータの複製を許可すべきではない。
dwTotalFrames
ファイル内のデータのフレームの総数を指定する。
dwInitialFrames
インターリーブされたファイルの開始フレームを指定する。インターリーブされたファイル以外では、ゼロを指定する。インターリーブされたファイルを作成する場合、ファイル内で AVI シーケンスの開始フレームより前にあるフレーム数を、このメンバに指定する。このメンバの内容に関する詳細については、『Video for Windows Programmer's Guide』の「Special Information for Interleaved Files」を参照すること。
dwStreams
ファイル内のストリーム数を指定する。たとえば、オーディオとビデオを含むファイルには 2 つのストリームがある。
dwSuggestedBufferSize
ファイルを読み取るためのバッファ サイズを指定する。一般に、このサイズはファイル内の最大のチャンクを格納するのに十分な大きさにする。ゼロに設定したり、小さすぎる値に設定した場合、再生ソフトウェアは再生中にメモリを再割り当てしなければならず、パフォーマンスが低下する。インターリーブされたファイルの場合、バッファ サイズはチャンクではなくレコード全体を読み取るのに十分な大きさでなければならない。
dwWidth
AVI ファイルの幅をピクセル単位で指定する。
dwHeight
AVI ファイルの高さをピクセル単位で指定する。
dwReserved[4]
予約されている。この配列はゼロに設定する。

AVI ストリーム ヘッダー

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

ストリーム ヘッダー構造体には、ファイル内の単一のストリームに対するヘッダー情報が含まれる。

typedef struct {
    FOURCC fccType;
    FOURCC fccHandler;
    DWORD dwFlags;
    DWORD  dwPriority;
    DWORD dwInitialFrames;
    DWORD  dwScale;
    DWORD  dwRate;
    DWORD  dwStart;
    DWORD  dwLength;
    DWORD dwSuggestedBufferSize;
    DWORD  dwQuality;
    DWORD  dwSampleSize;
    RECT   rcFrame;
} AVIStreamHeader;

ストリーム ヘッダーは、FOURCC を使用して、ストリームに含まれるデータのタイプ (オーディオ、ビデオなど) を指定する。

fccType
ストリームに含まれるデータのタイプを指定する FOURCC を含む。ビデオおよびオーディオに対して以下の標準 AVI 値が定義されている。
'vids'ストリームにビデオ データが含まれることを示す。ストリーム フォーマット チャンクには、パレット情報を含むことが可能な BITMAPINFO 構造体が含まれる。
'auds'ストリームにオーディオ データが含まれることを示す。ストリーム フォーマット チャンクには、WAVEFORMATEX または PCMWAVEFORMAT 構造体が含まれる。
'txts'ストリームにテキスト データが含まれることを示す。
fccHandler
特定のデータ ハンドラを示す FOURCC を含む (オプション)。データ ハンドラは、ストリームに対して適切なハンドラである。オーディオおよびビデオ ストリームの場合は、インストール可能なコンプレッサまたはデコンプレッサを指定する。
dwFlags
データ ストリームに対するフラグを含む。これらのフラグの上位ワードのビットは、ストリームに含まれるデータのタイプに固有である。以下の標準フラグが定義されている。
AVISF_DISABLEDこのストリームをデフォルトで有効にしないことを示す。
AVISF_VIDEO_PALCHANGESこのビデオ ストリームにパレットの変更が含まれることを示す。このフラグは、再生ソフトウェアに対して、パレットをアニメーションする必要があることを警告する。
dwPriority
ストリーム タイプの優先順位を指定する。たとえば、複数のオーディオ ストリームを含むファイルでは、優先順位の最も高いストリームがデフォルトのストリームになる。
dwInitialFrames
インターリーブされたファイルで、オーディオ データがビデオ フレームからどのくらいスキューされているかを指定する。通常は、約 0.75 秒である。インターリーブされたファイルを作成する場合、ファイル内で AVI シーケンスの開始フレームより前にあるフレーム数を、このメンバに指定する。このメンバの内容に関する詳細については、『Video for Windows Programmer's Guide』の「Special Information for Interleaved Files」を参照すること。
dwScale
dwRate とともに使用して、このストリームが使用するタイム スケールを指定する。dwRatedwScale で割ることにより、1 秒あたりのサンプル数が求められる。ビデオ ストリームの場合、このレートはフレーム レートに等しくなる。オーディオ ストリームの場合、このレートは nBlockAlign バイトのオーディオ データに必要な時間に対応する。これは PCM オーディオの場合はサンプル レートに等しくなる。
dwRate
dwScale を参照すること。
dwStart
AVI ファイルの開始タイムを指定する。単位は、メイン ファイル ヘッダーの dwRate および dwScale メンバによって定義される。通常、これはゼロであるが、ファイルと同時に開始されないストリームに対しては、遅延時間を指定することができる。
dwLength
このストリームの長さを指定する。単位は、ストリームのヘッダーの dwRate および dwScale メンバによって定義される。
dwSuggestedBufferSize
このストリームを読み取るために必要なバッファの大きさを指定する。通常は、ストリーム内の最大のチャンクに対応する値である。正しいバッファ サイズを使用することで、再生の効率が高まる。正しいバッファ サイズがわからない場合は、ゼロを指定する。
dwQuality
ストリーム内のデータの品質を示す値を指定する。品質は、0 〜 10,000 の範囲の値で示される。圧縮データの場合、これは通常、圧縮ソフトウェアに渡される品質パラメータの値を示す。–1 に設定した場合、ドライバはデフォルトの品質値を使用する。
dwSampleSize
データの 1 サンプルのサイズを指定する。サンプルのサイズが変化する場合は、ゼロに設定する。この値がゼロでない場合、ファイル内で複数のデータ サンプルを 1 つのチャンクにグループ化できる。ゼロの場合、各データ サンプル (ビデオ フレームなど) はそれぞれ別のチャンクに含まれなければならない。ビデオ ストリームの場合、この値は通常ゼロであるが、すべてのビデオ フレームが同じサイズであれば、ゼロ以外の値にもできる。オーディオ ストリームの場合、この値はオーディオを記述する WAVEFORMATEX 構造体の nBlockAlign メンバと同じでなければならない。
rcFrame
AVI メイン ヘッダー構造体の dwWidth および dwHeight メンバによって指定される動画矩形内のテキストまたはビデオ ストリームに対する転送先矩形を指定する。通常、rcFrame メンバは、複数のビデオ ストリームをサポートするために使用される。この矩形は、動画矩形に対応する座標に設定して、動画矩形全体を更新する。このメンバの単位はピクセルである。転送先矩形の左上隅は、動画矩形の左上隅からの相対指定となる。

最後の 8 つのメンバは、ストリームの再生特性を記述する。これらの要素には、再生レート (dwScaledwRate)、シーケンスの開始タイム (dwStart)、シーケンスの長さ (dwLength)、再生バッファのサイズ (dwSuggestedBuffer)、データ 品質の指標 (dwQuality)、およびサンプル サイズ (dwSampleSize) が含まれる。

ストリーム ヘッダー構造体のメンバのいくつかは、メイン ヘッダー構造体にも含まれる。メイン ヘッダーのデータはファイル全体に適用され、ストリーム ヘッダーのデータはストリームにだけ適用される。

ストリーム ヘッダー ('strh') チャンクの次には、ストリーム フォーマット ('strf') チャンクが続く。ストリーム フォーマット チャンクは、ストリーム内のデータのフォーマットを記述する。ビデオ ストリームの場合、このチャンク内の情報は BITMAPINFO 構造体 (該当する場合はパレット情報を含む) である。オーディオ ストリームの場合、このチャンク内の情報は WAVEFORMATEX または PCMWAVEFORMAT 構造体である (WAVEFORMATEX 構造体は WAVEFORMAT 構造体の拡張版である)。この構造体および他のストリーム タイプの詳細については、『New Multimedia Data Types and Data Techniques Standards Update』を参照すること。

'strl' チャンクには、ストリーム ヘッダー データ ('strd') チャンクが追加される場合がある。このチャンクを使用する場合は、ストリーム フォーマット チャンクの後に記述する。このチャンクのフォーマットと内容は、インストール可能な圧縮または復元ドライバによって定義される。通常、これらのドライバはこの情報を使用して設定を行う。RIFF ファイルを読み書きするアプリケーションは、この情報をデコードする必要はない。アプリケーションはドライバとの間でこのデータをメモリ ブロックとして転送する。

オプションの 'strn' ストリーム名チャンクは、ストリームについて説明するゼロ終端文字列を提供する。(AVI ファイル関数でこのチャンクを使用することにより、アプリケーションはアクセスしたいストリームを名前で識別することができる。)

AVI プレーヤーは、'strl' チャンクの順序に基づいて、LIST 'hdrl' チャンク内のストリーム ヘッダーを LIST 'movi' チャンク内のストリーム データと関連付ける。最初の 'strl' チャンクはストリーム 0 に対応し、2 番目の 'strl' チャンクはストリーム 1 に対応し、以下同様に続く。

たとえば、最初の 'strl' チャンクが wave オーディオ データを記述する場合、その wave オーディオ データはストリーム 0 に含まれる。同様に、2 番目の 'strl' チャンクがビデオ データを記述する場合、そのビデオ データはストリーム 1 に含まれる。

ストリーム データ (LIST 'movi' チャンク)

ヘッダー情報の次に続くのは、ストリーム内の実際のデータ (画像やサウンドそれ自体) のチャンクを含む LIST 'movi' チャンクである。データ チャンクは、LIST 'movi' チャンク内に直接記述する場合と、'rec' チャンクにグループ化する場合がある。'rec' へのグループ化は、グループ化されたチャンクがディスクから一度に読み出されることを意味する。これは、CD-ROM から再生するために特別にインターリーブされたファイルの場合にだけ使用される。

すべての RIFF チャンクと同様に、データ チャンクにはチャンク タイプを識別する FOURCC (4 文字コード) が含まれる。FOURCC は、1 文字から 4 文字の ASCII 英数字のシーケンスで表される 32 ビット量である (右側は空白文字が埋められる)。各チャンクを識別する FOURCC は、ストリーム番号と、チャンク内にカプセル化された情報のタイプを定義する 2 文字のコードとで構成される。たとえば、波形チャンクは 2 文字コード 'wb' で示される。波形チャンクが 2 番目の LIST 'hdrl' ストリーム記述に対応している場合、FOURCC は '01wb' となる。

注 :  2 文字コードはストリームを記述するのに便利な方法だが、他のアプリケーションがそれを認識するとは限らない。ストリームを作成したり情報を他のアプリケーションに転送する場合には、FOURCC を使用すること。

フォーマット情報はすべてヘッダーに含まれるため、これらのデータ チャンク内のオーディオ データにフォーマットに関する情報を含めてはならない。オーディオ データ チャンクのフォーマットを次に示す (## はストリーム識別子)。

WAVE Bytes '##wb'
BYTE  abBytes[];

音声データは、圧縮 DIB または非圧縮 DIB である。非圧縮 DIB の場合、関連する BITMAPINFO 構造体の biCompression メンバに BI_RGB が指定されている。圧縮 DIB の場合は、biCompression メンバに BI_RGB 以外の値が指定されている。圧縮フォーマットの詳細については、『Microsoft Windows Programmer's Reference』で BITMAPINFOHEADER データ構造体の説明を参照すること。

非圧縮 DIB のデータ チャンクには RGB ビデオ データが含まれる。これらのチャンクは、2 文字コード 'db' (db は DIB bits の略) で識別される。圧縮 DIB のデータ チャンクは、2 文字コード 'dc' (dc は DIB compressed の略) で識別される。どちらのデータ チャンクも、DIB に関するヘッダー情報は含んでいない。非圧縮 DIB のデータ チャンクのフォーマットを次に示す。

DIB  Bits  '##db'
BYTE  abBits[];

圧縮 DIB のデータ チャンクのフォーマットを次に示す。

Compressed DIB  Bits  '##dc'
BYTE  abBits[];

ビデオ データ チャンクは、AVI シーケンス内でパレットを更新するための新しいパレット エントリを定義することもできる。パレット情報の指定の詳細については、『Video for Windows Programmer's Guide』を参照すること。

テキスト ストリームには任意の 2 文字コードを使用できる。

BITMAPINFOHEADER 構造体

BITMAPINFOHEADER 構造体には、AVI RIFF ファイルのビデオ ストリームに関する情報が含まれる。この構造体には以下のメンバが含まれる。

typedef struct tagBITMAPINFOHEADER {
    DWORD  biSize;
    LONG   biWidth;
    LONG   biHeight;
    WORD   biPlanes;
    WORD   biBitCount;
    DWORD  biCompression;
    DWORD  biSizeImage;
    LONG   biXPelsPerMeter;
    LONG   biYPelsPerMeter;
    DWORD  biClrUsed;
    DWORD  biClrImportant;
} BITMAPINFOHEADER;
biSize
構造体が必要とするバイト数を指定する。
biWidth
ビットマップの幅をピクセル単位で指定する。
biHeight
ビットマップの高さをピクセル単位で指定する。biHeight の値が正である場合、ビットマップはボトムアップ DIB (device-independent bitmap : デバイスに依存しないビットマップ) であり、左下隅が原点となる。biHeight の値が負である場合、ビットマップはトップダウン DIB であり、左上隅が原点となる。
biPlanes
ターゲット デバイスに対する面の数を指定する。これは必ず 1 に設定する。
biBitCount
1 ピクセルあたりのビット数を指定する。圧縮フォーマットによっては、ピクセルの色を正しくデコードするためにこの情報が必要である。
biCompression
使用されている、または要求されている圧縮のタイプを指定する。既存の圧縮フォーマットと新しい圧縮フォーマットの両方でこのメンバを使用する。
biSizeImage
イメージのサイズをバイト単位で指定する。非圧縮 RGB ビットマップの場合は、0 に設定できる。
biXPelsPerMeter
ビットマップのターゲット デバイスの水平解像度を 1 メートルあたりのピクセル単位で指定する。アプリケーションはこの値を使用して、リソース グループの中から現在のデバイスの特性に最も適合するビットマップを選択することができる。
biYPelsPerMeter
ビットマップのターゲット デバイスの垂直解像度を 1 メートルあたりのピクセル単位で指定する。
biClrUsed
カラー テーブル内のカラー インデックスのうち、ビットマップ内で実際に使用されるインデックスの数を指定する。この値がゼロの場合、ビットマップは、biCompression で指定される圧縮モードに対して、biBitCount メンバの値に対応する最大色数を使用する。
biClrImportant
ビットマップを表示するために重要とみなされるカラー インデックス数を指定する。この値がゼロの場合は、すべての色が重要とみなされる。

biBitCount メンバの値が 8 より大きい値に設定された場合、ビデオ ドライバはビットマップがトゥルー カラーであるとみなすことができ、カラー テーブルを使用しない。

biBitCount メンバの値が 8 以下の値に設定された場合、ビデオ ドライバはビットマップが BITMAPINFO データ構造体に定義されたパレットまたはカラー テーブルを使用しているとみなすことができる。このデータ構造体は、以下のメンバを持つ。

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD          bmiColors[1];
} BITMAPINFO;

BITMAPINFO の bmiheader メンバは、BITMAPINFOHEADER 構造体を指定する。BITMAPINFO の bmiColors メンバは、ビットマップ内の色を定義する RGBQUAD データ型の配列を指定する。

WAVEFORMATEX 構造体

WAVEFORMATEX 構造体には、AVI RIFF ファイルのオーディオ データ ストリームに関する情報が含まれる。この構造体には以下のメンバが含まれる。

typedef struct waveformat_extended_tag {
    WORD  wFormatTag;      
    WORD  nChannels;       
    DWORD nSamplesPerSec;  
    DWORD nAvgBytesPerSec; 
    WORD  nBlockAlign;     
    WORD  wBitsPerSample;  
    WORD  cbSize;          
} WAVEFORMATEX;
wFormatTag
オーディオ ストリームのオーディオ波形タイプを定義する。フォーマット タグの完全なリストは、Microsoft® Visual C++® および他の Microsoft 製品に付属する Mmreg.h ヘッダー ファイルにある。
nChannels
オーディオ ストリーム内のチャンネル数を指定する。1 はモノ、2 はステレオを示す。
nSamplesPerSec
オーディオ ストリームのサンプル レート周波数をサンプル/秒 (Hz) で指定する。たとえば、11,025、22,050、または 44,100。
nAvgBytesPerSec
平均データ レートを指定する。再生ソフトウェアはこの値を使ってバッファ サイズを見積もることができる。
nBlockAlign
データのブロック アラインメントをバイト単位で指定する。再生ソフトウェアが 1 回に処理するデータのバイト数は nBlockAlign の整数倍でなければならないため、nBlockAlign の値を使用してバッファのアラインメントを行うことができる。
wBitsPerSample
チャンネル データごとの 1 サンプルあたりのビット数を指定する。各チャンネルのサンプル解像度は同じであると仮定される。このフィールドが必要ない場合は、ゼロに設定する。
cbSize
フォーマット ヘッダー内の追加情報のサイズをバイト単位で指定する。これには、WAVEFORMATEX 構造体のサイズは含まれない。たとえば、wFormatTag WAVE_FORMAT_IMA_ADPCM に対応する wave フォーマットの場合、cbSize は sizeof(IMAADPCMWAVEFORMAT) - sizeof(WAVEFORMATEX) として計算され、結果は 2 となる。

AVI 2.0 ファイル フォーマット拡張

現在 DirectShow は、以下の AVI 2.0 ファイル フォーマット拡張をサポートしている。

『OpenDML AVI File Format Extensions』(OpenDML AVI M-JPEG File Format Subcommittee 編、1996 年 2 月 28 日) のバージョン 1.02 に記載された仕様を参照すること。