WebM ファイル形式
Matroska/EBML をベースにした、オープンでロイヤリティフリーな動画コンテナ。
- MIME タイプ
- video/webm
- 拡張子
- .webm
- カテゴリ
- 動画
マジックナンバー(ファイル署名)
| 0x00000000 | 1A45DFA3 | ·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 から分ける唯一のフィールドです。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | EBML master element ID | 1A 45 DF A3。これがマジックナンバーのすべてで、Matroska とまったく同じものを共有しています。ファイル中で位置が固定されていると保証されるバイト列は、これだけです。 |
| 4 | 1 | EBML header size | 可変長整数です。先頭の 1 ビットが 1 バイト長であることを示し、残りの 7 ビットが値になります。9F は 31 で、後続するヘッダ本体のバイト数です。書き手はこの整数を最大 8 バイトまでパディングしてよいので、ちょうど 1 バイトではなく 1〜8 バイトとして扱ってください。 |
| 5 | 4 | EBMLVersion element | 42 86 81 01。2 バイトの要素 ID、サイズ 1 の 1 バイト、値 1 という並びです。EBML ヘッダの要素はすべて既定値を持ち、丸ごと省略できます。ここから下のオフセットが、仕様が固定したものではなく典型的な書き手の出力に過ぎないのはそのためです。 |
| 9 | 4 | EBMLReadVersion element | 42 F7 81 01。ファイルを解釈するためにリーダーが最低限実装していなければならないバージョンです。形式が公開されて以来 1 のままです。 |
| 13 | 4 | EBMLMaxIDLength element | 42 F2 81 04。このファイルに現れる要素識別子の最大長をバイトで示します。4 が世界共通の値で、パーサはこれを見てバッファサイズを決められます。 |
| 17 | 4 | EBMLMaxSizeLength element | 42 F3 81 08。ファイル中のサイズフィールドの最大長をバイトで示します。8 が標準で、後述する未定サイズの符号化が 8 バイト幅になるのはこの値のためです。 |
| 21 | 2 | DocType element ID | 42 82。これが実際にどの EBML ベース形式なのかを名乗る要素で、WebM ファイルと MKV ファイルを先頭 20 バイトでは区別できない理由そのものです。 |
| 23 | 1 | DocType length | 84。1 バイトの可変長整数で値は 4、続く文字列の長さです。Matroska ファイルではここが 88 になります。matroska が 8 文字だからで、それ以降のオフセットはすべて 4 ずれます。 |
| 24 | 4 | DocType value | 77 65 62 6D、ASCII の webm。形式を決めるのはこのフィールドです。これより前は Matroska ファイルと同一で、これより後は同じ配置になっています。 |
| 28 | 4 | DocTypeVersion element | 42 87 81 02。書き手が使った WebM の要素セットの改訂版です。より低いバージョンしかサポートしないリーダーは、失敗するのではなく認識できない要素を読み飛ばすことが期待されています。 |
| 32 | 4 | DocTypeReadVersion element | 42 85 81 02。すべての要素を理解できるかどうかとは別に、そもそもファイルを解析するためにリーダーが必要とする最低限の改訂版です。 |
| 36 | 4 | Segment element ID | 18 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 と混同しやすい形式です。先頭バイトを見比べてください。