ByteScope

AVI ファイル形式

Audio Video Interleave。Microsoft の古典的な RIFF 動画コンテナ。

MIME タイプ
video/x-msvideo
拡張子
.avi
カテゴリ
動画

マジックナンバー(ファイル署名)

0x0000000052494646RIFFRIFF container
0x0000000841564920AVI 'AVI ' form type

AVI 形式について

AVI は Microsoft が 1992 年に作った動画コンテナで、土台は RIFF です。WAV と同じチャンク構造で、どのチャンクも 4 文字の識別子、リトルエンディアン 32 ビットの長さ、そしてその長さぶんのペイロードでできています。設計は 1 ページのコードで解析できるほど単純で、その単純さがすべてを物語ります。AVI には可変フレームレートというまともな概念がなく、今どきの音声へのコンテナレベルの対応もなく、字幕トラックもトラックごとの言語もなく、32 ビットのサイズフィールドは OpenDML 拡張が回避策を作るまでファイル長に厳しい天井を課していました。代わりに持っているのは完全に固定されたヘッダです。仕様が hdrl リストを先頭に、そのリストの中でメインヘッダチャンクを先頭に置くことを要求しているので、AVI の幅・高さ・フレームレートは常に同じバイトオフセットにあります。

ヘッダーの構造(バイト単位)

オフセット長さフィールド意味
04RIFF signature52 49 46 46、ASCII の RIFF。WAV や WebP をはじめ Microsoft 時代の他の形式とも共有しているので、これ単体で分かるのはチャンク構造であって形式ではありません。
44RIFF chunk sizeこのフィールドより後ろ全体のバイト数をリトルエンディアンで表したもの、つまりファイルサイズから 8 を引いた値です。AVI のサイズはすべてリトルエンディアンで、QuickTime ファイルを見ているのではないと確かめるいちばん速い方法になります。
84Form type 'AVI '41 56 49 20。末尾の ASCII スペースは 4 文字コードの一部です。このファイルを WAV でも WebP でもなく AVI にしているのはこのフィールドで、素朴な文字列比較が取り逃すのはこのスペースのせいです。
124LIST identifier4C 49 53 54。RIFF はチャンクをリストにまとめますが、仕様はヘッダリストがファイル中で最初のリストであることを要求しています。以下のオフセットが予測可能なのはそのおかげです。
164LIST sizeヘッダリストの長さをリトルエンディアンで表したもので、直後に来る 4 文字のリスト型は数えますが、この 4 バイト自体は数えません。メインヘッダと、トラックごとのストリームヘッダブロックをカバーします。
204List type 'hdrl'68 64 72 6C。このリストがヘッダリストであることを名乗ります。仕様上どのデータよりも前に来ることが要求されていて、MP4 とは逆の配置です。途中で切れた AVI でも寸法だけは正しく報告されるのはこのためです。
244Chunk identifier 'avih'61 76 69 68、メインの AVI ヘッダです。hdrl の中の最初のチャンクでなければならないので、整形式のファイルでは必ずこのオフセットにあります。
284avih chunk sizeリトルエンディアンで、常に 38 00 00 00、つまり 56 バイトです。この後ろに続く 14 個の 32 ビットフィールドの合計です。これ以外の値なら、ヘッダが壊れているか、書き手が標準外のものを出力しています。
324Microseconds per frameリトルエンディアンで、コンテナレベルでフレームレートを述べる唯一の場所です。00 01 86 A0 をリトルエンディアンで読むと 100000 で、毎秒 10 フレームになります。AVI には可変レートを表す手段がまったくなく、これがこの形式で最も影響の大きい制約です。
364Maximum bytes per secondこのファイルが必要とすると見込まれるデータレートの上限を、1 秒あたりのバイト数で表したものです。メディアが追いつけるかどうかをプレイヤーが判断できるようにする意図でしたが、今日では事実上の参考値です。
404Padding granularityデータチャンクをパディングする際のアラインメントをバイトで示します。CD-ROM 再生向けに書かれたファイルでは 2048、それ以外のほぼすべてではパディングなしを意味する 0 です。ここに挙げているのは、省くとこの表に説明のつかない 4 バイトの穴が空くからです。
444Flagsビットフィールドです。ビット 4 は索引チャンクがあること、ビット 5 は再生順の決定に索引を使うべきこと、ビット 8 はインターリーブされていること、ビット 16 はライブ収録されたことを示します。効いてくるのは索引のビットで、これが無いとシークが線形走査に成り下がります。
484Total framesファイルの総フレーム数をリトルエンディアンで。エンコード完了後に書かれるので、中断された録画ではここが 0 か古い値のまま残り、フレームは全部あるのにプレイヤーの表示する再生時間が間違ったものになります。
524Initial framesインターリーブされたファイルで、音声が映像より何フレーム先行しているかを示します。ライブソースから収録したもの以外では 0 で、0 でない値をプレイヤーが無視することが、ファイル全体を通した固定の音ズレの原因のひとつになります。
564Stream counthdrl の中に続くストリームヘッダブロックの数です。映像 1 つと音声 1 つで 2 が通例ですが、形式としてはもっと持てますし、古いファイルには今どこもデコードしないテキストや MIDI のストリーム用に 3 つ目が入っていることもあります。
604Suggested buffer sizeプレイヤーに必要だと書き手が考える読み込みバッファの大きさをバイトで示し、通常はファイル中で最大のチャンクのサイズです。純粋な参考値で、実測ではなくきりのよい 1 メガバイトが書かれていることがよくあります。
644Width in pixelsリトルエンディアン。これは絵の大きさについてのコンテナ側の主張であって、映像ストリーム自身が述べる値と常に一致するとは限りません。両者の食い違いは、古いキャプチャ機器が作ったファイルで実際に起こります。
684Height in pixelsリトルエンディアンで、幅とまったく同じ符号化です。オフセット 64 と合わせたこの 8 バイトが、AVI の寸法を読むいちばん速くて確実な方法になります。準拠したファイルなら必ず固定位置にあるからです。
7216Reserved32 ビットワードが 4 つ、すべて 0 です。これで 56 バイトのメインヘッダが終わるので、次のチャンクはオフセット 88 から始まります。通常は最初のストリームのヘッダを収める strl リストです。

似た形式との見分け方

紛らわしい形式見分け方
WAV同じ RIFF コンテナで、オフセット 8 のフォームタイプが違います。AVI の 41 56 49 20 ではなく WAVE の 57 41 56 45 です。オフセット 7 までは同一なので、先頭 4 バイトを見て分かるのはこのファイルが RIFF だということだけです。フォームタイプから先の配置は完全に分かれます。WAV はいきなり fmt チャンクへ行き、AVI は hdrl リストを開きます。
WebPこちらも RIFF で、オフセット 8 が WEBP の 57 45 42 50 です。3 つとも hex ダンプの冒頭が同じ 4 文字の ASCII とリトルエンディアンの長さなので、ぱっと見の紛らわしさは本物です。動画と音声と静止画を分けているのは、オフセット 8 のバイトだけです。
Matroska共有しているものはありません。Matroska はオフセット 0 が 1A 45 DF A3 で始まり、全体を通して可変長のサイズを使います。この 2 つを組で覚えておく価値があるのは、古い AVI を MKV へ remux するとフレームは可逆コピーのまま、可変フレームレートと字幕トラックときちんとした索引が手に入るからです。
OpenDML AVI 2.0実質的な 2 GB と 4 GB の上限を取り払った拡張です。そういうファイルも冒頭は上と同じく RIFF と AVI で始まり、違いは後ろに出てきます。フォームタイプが AVI ではなく AVIX のトップレベル RIFF チャンクが追加され、それぞれがストリームの続きを運びます。最初の RIFF チャンクで読み止めるリーダーは、大きなファイルの冒頭部分だけを再生し、壊れているのではなく短いファイルだと報告します。

よくある壊れ方

  • idx1 索引チャンクの欠落や途中切れ。これはファイルの末尾にあるので、中断したダウンロードや打ち切られた収録で真っ先に失われます。チャンク自体が自己記述的なので映像は最初から再生できますが、シークは失敗するか、1 回のジャンプに数秒かかる線形走査に落ちます。
  • 2 GB と 4 GB の壁。オフセット 4 の RIFF サイズフィールドは 32 ビットなので、OpenDML の AVIX 拡張を出力しない書き手は、ファイルが上限を超えた時点で値が単純に回り込みます。できあがるものは整形式で、数値だけが間違っています。プレイヤーはディスク上のファイルよりはるかに小さいサイズを読み、早々に停止します。
  • オフセット 48 のフレーム数の誤り。エンコード完了時に書かれるので、クラッシュしたり強制終了したりした収録では 0 か、書き手が推測した値のまま残ります。フレームはすべて存在して再生もでき、表示される再生時間だけが無意味な値になります。再エンコードではなくヘッダの修復で済む話です。
  • 音声と映像のずれ。AVI は固定レートのチャンクをインターリーブする設計なので、そもそも想定されていない可変ビットレートで符号化された音声は、長いファイルにわたって映像に対する誤差を積み上げます。最初の 1 分では聞き取れず、20 分目にはひどくずれていて、ヘッダにはその兆候が何ひとつありません。
  • もう誰も持っていないコーデック。各ストリームヘッダの 4 文字コードは DIVX・XVID・MP42・IV50 といったものを名指ししますが、その手のデコーダの多くは、同梱していた OS と一緒に消えました。コンテナは無傷でオフセットもすべて正しく読めます。デコーダが無いから再生できないだけで、修復ではなくトランスコードで解決します。

この形式の現在地

AVI は消えることを拒み続けるレガシー形式で、新規の作業には少なくとも 15 年前から不適切な選択です。制約は偶発的なものではなく構造的なもので、固定フレームレートのみ、字幕トラックなし、トラックごとの言語なし、今どきの音声なし、拡張で取り繕った 32 ビットのサイズフィールドといった具合です。MP4 も Matroska もその全部を解決しています。今でも出会うのはアーカイブの中で、ビデオカメラのキャプチャ、古いキャプチャカードでの画面収録、テープからデジタル化した映像、そして一度書かれたきり見直されないファームウェアを積んだ科学用・産業用カメラの出力です。無圧縮や軽い圧縮の AVI は、いくつかのキャプチャ経路で今も一時形式として使われています。チャンクと長さを書くことは、機器がリアルタイムでできる処理としてほぼ最も安いからです。残しておきたいものなら、Matroska へ remux すればフレームには手を触れないまま、このコンテナに欠けているものをすべて手に入れられます。

AVI ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

AVI と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
MP466 74 79 70.mp4
Matroska1A 45 DF A3.mkv
WAV52 49 46 46.wav
WebP52 49 46 46.webp

よくある質問

ファイルのマジックナンバーとは何ですか?

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。PNG は必ず 89 50 4E 47 で始まり、ZIP は 50 4B 03 04 で始まります。OS もブラウザも file コマンドも、拡張子を信用せずこのバイト列を読みます。だからファイル名を変えても中身の正体は変わりません。

マジックナンバーを自分で確認する方法は?

macOS や Linux なら xxd -l 16 ファイル名 で先頭 16 バイトが表示されます。Windows なら PowerShell で Format-Hex -Path ファイル名 -Count 16 です。あるいはこのサイトのファイル形式判別ツールにドロップすれば、ローカルでバイト列を読んで形式を教えてくれます。アップロードはありません。

2 つの形式が同じマジックナンバーを持つのはなぜ?

一方が他方の上に作られているからです。docx、xlsx、pptx、apk、jar、epub はすべて中身が ZIP アーカイブなので ZIP の署名で始まり、区別するには内部のエントリを見る必要があります。Java の class ファイルと macOS のユニバーサルバイナリはどちらも CA FE BA BE で始まり、直後のフィールドで見分けます。

マジックナンバーがまったくないファイルもある?

あります。XML、HTML、JSON、SVG、CSV といったテキストベースの形式には固定のバイト署名がないため、構造から判別します。先頭の <?xml 宣言、<svg 要素、あるいは { に続く引用符付きのキーなどです。これは確定ではなく推測なので、このリファレンスではそうした形式をプローブ判別として示しています。

マジックナンバーが一致すればそのファイルは安全?

いいえ。わかるのは形式であって、中身が無害かどうかではありません。正規の PDF や docx でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

AVI かもしれないファイルをお持ちですか?ファイル形式判別ツールで調べる — マジックナンバーをローカルで読み取ります。アップロードは一切ありません。またはすべての形式を見る。