知り合いから、どこぞで入手したAVIを再生したいが、CODECがわからないので、どうやってしればいいのか?という質問を受けた。そういえばVideo
for Windowsの時代にはファイルのプロパティや、MediaPlayer上でCODECを確認することができたのだが、最近はできなくなっていることを思い出した。これは調べてみる価値があるぞ…ということで、調査してみた。
詳しいことは本家(DirectShow / MSDN)を見てもらうことにして、その要約を行おう。
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'
|
さて、Video for Windows(VFW)の時代には簡単に確認できたのに、それができなくなっているのはなぜだろうか。答えは簡単で、時代の要請にそってRIFFのサブフォーマットがつぎつぎと増えているのに対し、Windows Explorerのプロパティ表示コンポーネントがVFWの時代のままだからだ。
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ファイルをダンプすると、その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 のことである。
| 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 (高圧縮) |