ByteScope

WebM ファイル形式

Matroska/EBML をベースにした、オープンでロイヤリティフリーな動画コンテナ。

MIME タイプ
video/webm
拡張子
.webm
カテゴリ
動画

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

0x000000001A45DFA3·E··EBML header

先頭付近の EBML DocType 文字列が 'webm'(MKV は 'matroska')になっています。

WebM 形式について

WebM は Google が HTML5 の動画向けに定めたロイヤリティフリーのコンテナで、VP8・VP9・AV1 の映像に Vorbis または Opus の音声を組み合わせます。新しい形式というより、意図的に絞り込んだ形式です。WebM とは、ライセンスなしで配れるものだけにコーデック一覧を削った Matroska であり、両者は EBML の符号化をバイト単位で共有しています。EBML は XML のバイナリ版のような存在で、どの要素も可変長の識別子、可変長のサイズ、そして値かさらに別の要素という並びになっています。つまり WebM ファイルには先頭数バイトから先に固定の配置が存在せず、パーサは位置を計算するのではなく歩いていくしかありません。ファイルは EBML ヘッダで始まります。これは残りをどう符号化しているかを述べる小さなマスター要素で、その中の DocType 文字列こそが、WebM を素の Matroska から分ける唯一のフィールドです。

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

オフセット長さフィールド意味
04EBML master element ID1A 45 DF A3。これがマジックナンバーのすべてで、Matroska とまったく同じものを共有しています。ファイル中で位置が固定されていると保証されるバイト列は、これだけです。
41EBML header size可変長整数です。先頭の 1 ビットが 1 バイト長であることを示し、残りの 7 ビットが値になります。9F は 31 で、後続するヘッダ本体のバイト数です。書き手はこの整数を最大 8 バイトまでパディングしてよいので、ちょうど 1 バイトではなく 1〜8 バイトとして扱ってください。
54EBMLVersion element42 86 81 01。2 バイトの要素 ID、サイズ 1 の 1 バイト、値 1 という並びです。EBML ヘッダの要素はすべて既定値を持ち、丸ごと省略できます。ここから下のオフセットが、仕様が固定したものではなく典型的な書き手の出力に過ぎないのはそのためです。
94EBMLReadVersion element42 F7 81 01。ファイルを解釈するためにリーダーが最低限実装していなければならないバージョンです。形式が公開されて以来 1 のままです。
134EBMLMaxIDLength element42 F2 81 04。このファイルに現れる要素識別子の最大長をバイトで示します。4 が世界共通の値で、パーサはこれを見てバッファサイズを決められます。
174EBMLMaxSizeLength element42 F3 81 08。ファイル中のサイズフィールドの最大長をバイトで示します。8 が標準で、後述する未定サイズの符号化が 8 バイト幅になるのはこの値のためです。
212DocType element ID42 82。これが実際にどの EBML ベース形式なのかを名乗る要素で、WebM ファイルと MKV ファイルを先頭 20 バイトでは区別できない理由そのものです。
231DocType length84。1 バイトの可変長整数で値は 4、続く文字列の長さです。Matroska ファイルではここが 88 になります。matroska が 8 文字だからで、それ以降のオフセットはすべて 4 ずれます。
244DocType value77 65 62 6D、ASCII の webm。形式を決めるのはこのフィールドです。これより前は Matroska ファイルと同一で、これより後は同じ配置になっています。
284DocTypeVersion element42 87 81 02。書き手が使った WebM の要素セットの改訂版です。より低いバージョンしかサポートしないリーダーは、失敗するのではなく認識できない要素を読み飛ばすことが期待されています。
324DocTypeReadVersion element42 85 81 02。すべての要素を理解できるかどうかとは別に、そもそもファイルを解析するためにリーダーが必要とする最低限の改訂版です。
364Segment element ID18 53 80 67。ファイル内のすべてのトラック、クラスタ、キュー、タグを収めるコンテナで、実質ファイルの全体です。サイズフィールドが直後に続き、ライブで書き込み中のファイルではその値がすべて 1 の未定形になります。

似た形式との見分け方

紛らわしい形式見分け方
Matroskaこの 2 つは同じ符号化で、違いはオフセット 24 の DocType 文字列、webm か matroska かだけです。もっと手前のオフセット 4 に近道もあります。Matroska では DocType が 4 文字長いので、EBML ヘッダサイズのバイトが A3(35)になり、WebM では 9F(31)になるからです。実務上の違いはコーデックです。Matroska ファイルは H.264・HEVC・AC-3・DTS を持てますが、そのどれも WebM には属さず、コンテナとして解析できてもブラウザは拒否します。
MP4構造上の関係はまったくありません。MP4 はビッグエンディアン 32 ビットのサイズを持つボックスの木で、マジックはオフセット 4。WebM は何もかも可変長の EBML で、マジックはオフセット 0 です。混乱はもっぱら拡張子のレベルで起きます。どちらも AV1 と Opus を運び、どちらも今どきのブラウザで再生できるので、両者の間でリネームされて開けなくなるのです。
MKA.mka は音声トラックしか持たない Matroska ファイル、.mks は字幕だけのものです。どちらもヘッダに見分けのつくバイトはありません。DocType は matroska のままです。判定するには Tracks 要素まで歩いて各トラックの型を読むしかありません。音声のみの WebM も同じで、ブラウザがマイクから録音したときに作られるのがこれです。
Ogg同じ時代のもうひとつのロイヤリティフリーなコンテナですが、バイトレベルでは無関係です。Ogg ファイルはオフセット 0 が ASCII の大文字 O から始まるページマーカー 4F 67 67 53 です。Ogg はストリーミング向けに設計されたページとグラニュールの構造で Vorbis・Opus・Theora を運び、WebM は Matroska のクラスタとキューを受け継いでいます。

よくある壊れ方

  • 再生時間を持たないライブ録画。MediaRecorder 経由で録るブラウザは Segment がどれだけの長さになるか知りようがないので、未定サイズの形、つまりサイズ整数の値ビットをすべて 1 にした形を書きます。EBML がまさにこの用途のために許している 8 バイト符号化では 01 FF FF FF FF FF FF FF です。ファイルは完全に正しく、そして完全にシークできません。プレイヤーは再生時間を表示せず、remux するまでシークバーは何も動きません。
  • Cues の欠落。シーク索引は任意の要素で、ストリーミングで書く側は追記する機会をそもそも得られません。ライブソースから録った WebM は最初から再生はできてもジャンプができません。壊れてはいません。ストリームをコピーして Cues 要素を書く remux をすれば、圧縮フレームに一切触れずに直ります。
  • 途中切れ。どの要素も自分の長さを申告するので、リーダーは最後の完全なクラスタまで平然と歩き、そこで存在しないバイトを約束するサイズに出くわします。多くのプレイヤーはデコードできた分を見せて止まり、一部はファイル全体を破損と報告します。同じ途中切れファイルが 2 つのツールで違う挙動になるのはこのためです。
  • 正しく見えるコンテナに、違うコーデックが入っている場合。DocType は webm なのにトラックが H.264 を抱えているファイルは、実用上どんな意味でも WebM ではありません。解析はできますし hex ダンプもきれいで、それでいてどのブラウザも拒否します。食い違いは Tracks 要素の中の CodecID 文字列にあり、ヘッダのどこにもありません。
  • 先頭のゴミ。.webm という名前で保存された HTML のエラーページは、1A 45 DF A3 があるべき場所に読めるテキストを置きます。MP4 と違って WebM の中には壊れて困る絶対ファイルオフセットが記録されていないので、先頭のバイトを削除すればたいてい中身は無事です。

この形式の現在地

WebM が生まれたのは H.264 にライセンス料が付いていたからで、オープンウェブに誰も払わなくてよい動画形式を与えるという明確な役目は果たしました。どのブラウザでも再生できますし、ページが画面・カメラ・マイクを録るときにブラウザが吐くのもこれです。はっきり勝っているのはオープンウェブでの VP9 と AV1 の配信、そして Opus の音声です。Opus は低ビットレートで AAC を、音声通話で意味があるほどの差で上回ります。負けているのはハードウェアと Apple が絡むところ全部です。Safari の対応は遅れたうえに部分的なままですし、スマートフォンが専用回路でデコードするのは H.264 で、VP9 は機種次第。テレビもカメラも編集ソフトも、WebM を一級の形式として扱いません。実務ではサイトが両方配ります。要求してきたブラウザには WebM、それ以外には MP4 です。そして片方しか残せないなら、残すのは MP4 のほうです。

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

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

関連する形式

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

形式先頭バイト拡張子
Matroska1A 45 DF A3.mkv
MP466 74 79 70.mp4
Ogg4F 67 67 53.ogg

よくある質問

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

ファイル先頭の数バイトで、名前が何であろうとその形式を示すものです。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 でも悪意のあるペイロードを含んでいることがあります。特に拡張子とバイト列が食い違うときに真の形式を知るのは有用な第一段階ですが、マルウェアスキャンではありません。

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