AVIファイルの内部構造

■ 前振り

知り合いから、どこぞで入手したAVIを再生したいが、CODECがわからないので、どうやってしればいいのか?という質問を受けた。そういえばVideo for Windowsの時代にはファイルのプロパティや、MediaPlayer上でCODECを確認することができたのだが、最近はできなくなっていることを思い出した。これは調べてみる価値があるぞ…ということで、調査してみた。
詳しいことは本家(DirectShow / MSDN)を見てもらうことにして、その要約を行おう。

■ RIFFフォーマット

AVIファイルは、Microsoftによって定められたRIFF(Resource Interchange File Format)と呼ばれるマルチメディアフォーマットのひとつである。RIFFフォーマットは自由度の高い形式であり、AVI以外にもWAVやMID、DIB(ビットマップ)も含まれる。

RIFFフォーマットはその名のとおり'RIFF'という4文字で始まる。続いて'AVI(スペース)'という4文字でAVIであることが識別される。また、AVIファイルは2つのLISTチャンクと呼ばれるブロックに分けられている。1つはAVIファイルのフォーマットを格納し、もう1つはストリームデータである。さらにindexチャンクというものが含まれる場合がある。

RIFF ('AVI'
LIST ('hdrl'
:
)
LIST ('movi'
:
)
['idxl' <AVI Index>]
)

さて、Video for Windows(VFW)の時代には簡単に確認できたのに、それができなくなっているのはなぜだろうか。答えは簡単で、時代の要請にそってRIFFのサブフォーマットがつぎつぎと増えているのに対し、Windows Explorerのプロパティ表示コンポーネントがVFWの時代のままだからだ。

■ プロパティで確認できるAVIファイル

RIFFファイルの構造をもうすこし詳しく見ていこう。まずはプロパティで構造を確認できるAVIファイルをダンプする。

アドレス データ 文字
000000 52 49 46 46 D6 1A 4B 00 41 56 49 20 4C 49 53 54 RIFF . . K . AVI LIST
000010 D4 07 00 00 68 64 72 6C 61 76 69 68 38 00 00 00 . . . . hdrl avih 8 . . .
000020 31 04 01 00 00 00 00 00 5C 00 50 45 10 07 00 00 1 . . . . . . . \ . P E . . . .
000030 CC 01 00 00 0C 00 00 00 02 00 00 00 4E A8 0A 00 . . . . . . . . . . . . N . . .
000040 F0 00 00 00 B4 00 00 00 00 00 00 00 79 1A F7 BF . . . . . . . . . . . . y . . .
000050 F4 6C 00 00 FF FF FF FF 4C 49 53 54 74 00 00 00 . l . . . . . . LIST . . . .
000060 73 74 72 6C 73 74 72 68 38 00 00 00 76 69 64 73 strl strh 8 . . . vids
000070 69 76 33 32 30 75 00 00 00 00 00 00 00 00 00 00 iv32 . . . . . . . . . . .
アドレス 構造 コメント
000000 RIFF ('AVI ' <4,922,070 bytes> RIFFファイルヘッダ
00000C LIST ('hdrl' <2,004 bytes> フォーマットチャンク
000018 'avih' (56 bytes) メインAVIヘッダ
000020 dwMicroSecPerFrame = 66,609 フレームあたりのマイクロ秒
000024 dwMaxBytesPerSec = 0 秒あたりの最大バイト数
000028 dwPaddingGranularity = 1,162,870,876
00002C dwFlags = 0x0710 フラグ
000030 dwTotalFrames = 460 全フレーム数
000034 dwInitialFrames = 12 再生開始フレーム
000038 dwStreams = 2
000034 dwSuggestedBufferSize = 698,446 推奨バッファサイズ
000040 dwWidth = 240 画面サイズ
000044 dwHeight = 180 画面サイズ
000048 dwReserved[4] 予約
000058 LIST ('strl' <116 bytes> 
000064 'strh' (56 bytes) AVIストリームヘッダ
00006C fccType = 'vids' ストリームの種類
000070 fccHandler = 'iv32' 俗にいうCODEC (Indeo 3.2)
000074 dwFlags = 0x0000
000078 wPriority = 0
00007A wLanguage = 0
00006C dwInitialFrames = 0

注目すべきは、このダンプリスト中では64バイト目にある fccType というメンバである。これら4文字で表されるコードはFOURCC(Four Character Code)と呼ばれている。通常のAVIファイルのfccTypeは 'vids' である。

■ プロパティで確認できないAVIファイル

認識できないAVIファイルをダンプすると、そのFOURCC(4文字コード)が 'vids' ではなく 'iavs' となっていることが判る。

アドレス データ 文字
000000 52 49 46 46 F8 7B 29 09 41 56 49 20 4C 49 53 54 RIFF . { ) . AVI LIST
000010 C4 7F 00 00 68 64 72 6C 61 76 69 68 38 00 00 00 . . . . hdrl avih 8 . . .
000020 56 82 00 00 49 D8 37 00 00 02 00 00 00 08 00 00 V . . . I . 7 . . . . . . . . .
000030 FD 04 00 00 00 00 00 00 01 00 00 00 C8 D4 01 00 . . . . . . . . . . . . . . . .
000040 00 00 00 00 00 00 00 00 4C 49 53 54 6C 7E 00 00 . . . . . . . . . LIST l ~ . .
000050 73 74 72 6C 73 74 72 68 38 00 00 00 69 61 76 73 s t r l s t r h 8 . . . iavs
000060 64 76 73 64 00 00 00 00 00 00 00 00 FD 04 00 00 dvsd . . . . . . . . . . . .
000070 E9 03 00 00 30 75 00 00 00 00 00 00 00 00 00 00 . . . . 0 U . . . . . . . . .
アドレス 構造 コメント
000000 RIFF ('AVI' <153713656 bytes> RIFFファイルヘッダ
00000C LIST ('hdrl' <32708 bytes> フォーマットチャンク
000018 'avih' (56 bytes)
000020 dwMicroSecPerFrame = 33366 フレームあたりのマイクロ秒
000024 dwMaxBytesPerSec = 3659849 秒あたりの最大バイト数
000028 dwPaddingGranularity = 512
00002C dwFlags = 0x0800 フラグ
000030 dwTotalFrames = 1277 全フレーム数
000034 dwInitialFrames = 0 再生開始フレーム
000038 dwStreams = 1
000034 dwSuggestedBufferSize = 120008 推奨バッファサイズ
000040 dwWidth = 0 画面サイズ
000044 dwHeight = 0 画面サイズ
000048 LIST ('strl' <32364 bytes> 
000054 'strh' (56 bytes) AVIストリームヘッダ
00005C fccType = 'iavs' ストリームの種類
000060 fccHandler = 'dvsd' CODEC
000064 dwFlags = 0x00
000068 wPriority = 0
00006A wLanguage = 0
00006C dwInitialFrames = 0
000070 dwScale = 1001
000074 dwRate = 30000
000078 dwStart = 0
00007C dwLength= 1277

iavs というのは interleaved audio and video stream のことである。


代表的なCODEC
fccType fccHandler CODEC
vids cvid Radius CinePak
vids msvc Microsoft Video 1
vids iv32 Intel Indeo 3.2
vids iv41 Intel Indeo 4.1
vids iv50 Intel Indeo 5.1
vids mpg4 Microsoft MPEG4 v1
vids mp42 Microsoft MPEG4 v2
vids mp43 Microsoft MPEG4 v3
vids div3 DivX Low-Motion
vids div4 DivX Fast-Motion
vids divx Divx 4.x/5.x
vids xvid Xvid
vids dvsd DV-AVI type 2
iavs dvsd DV (D1) type 1
iavs dvhd DV (HD)
iavs dvsl DV (高圧縮)

AVIフォーマットのDVデータ