Matroska ファイル形式
Matroska。ほぼあらゆるコーデックを収められるオープンなコンテナ。
- MIME タイプ
- video/x-matroska
- 拡張子
- .mkv
- カテゴリ
- 動画
マジックナンバー(ファイル署名)
| 0x00000000 | 1A45DFA3 | ·E·· | EBML header |
先頭付近の EBML DocType 文字列が 'matroska' になっています。
Matroska 形式について
Matroska は、何でも入れられることを目指したオープンなコンテナです。どんな映像コーデックでも、どんな音声コーデックでも、いくつでも字幕トラックを、そしてチャプター、添付ファイル、タグ、トラックごとの言語をすべて 1 ファイルに収められます。土台は EBML で、これは XML に似た形のバイナリ符号化です。どの要素も可変長の識別子、可変長のサイズ、そして値か入れ子の要素という並びになっています。サイズが暗黙ではなく明示されているので、Matroska ファイルは中の要素をひとつも理解しないまま歩けますし、リーダーは知らないものを読み飛ばせます。WebM はコーデック一覧を絞っただけの同じ符号化なので、両者は先頭 21 バイトまで同一で、違うのは形式を名乗る DocType 文字列だけです。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | EBML master element ID | 1A 45 DF A3。マジックナンバーであり、慣習ではなく仕様によって位置が固定されているファイル中唯一のフィールドです。WebM もここにまったく同じ 4 バイトを持ちます。 |
| 4 | 1 | EBML header size | 可変長整数で、先頭の 1 ビットが 1 バイト長であることを示し、残り 7 ビットがヘッダ本体のサイズになります。Matroska ファイルでは A3 で 35、WebM では 9F で 31 です。この 4 の差は matroska と webm の文字数の差です。書き手はこの整数を最大 8 バイトまでパディングして構いません。 |
| 5 | 4 | EBMLVersion element | 42 86 81 01。要素 ID、サイズ 1、値 1 という並びです。このヘッダの要素はどれも既定値を持ち、合法的に省略できるので、以下のオフセットは仕様が保証する配置ではなく、普通の書き手が出力する形を述べたものです。 |
| 9 | 4 | EBMLReadVersion element | 42 F7 81 01。ファイルを解析するためにリーダーが実装していなければならない EBML の最低バージョンです。1 から動いたことがありません。 |
| 13 | 4 | EBMLMaxIDLength element | 42 F2 81 04。このファイルのどこかで使われる要素識別子の最大長で、実際には 4 バイト。パーサが処理を始める前にバッファサイズを固定できます。 |
| 17 | 4 | EBMLMaxSizeLength element | 42 F3 81 08。ファイル中のサイズフィールドの最大長です。8 が通例で、ライブ書き込み中の Segment に付く未定サイズのマーカーが 8 バイト幅になるのはこの値のためです。 |
| 21 | 2 | DocType element ID | 42 82。ファイルが実際にどの EBML ベース形式なのかを名乗ります。Matroska ファイルを先頭 20 バイトで WebM と区別できない、唯一の理由です。 |
| 23 | 1 | DocType length | 88。1 バイトの可変長整数で値は 8、続く文字列の長さです。WebM は 4 文字の名前なのでここが 84 になり、この位置より後ろのオフセットは 2 つの形式で 4 ずれます。 |
| 24 | 8 | DocType value | 6D 61 74 72 6F 73 6B 61、ASCII の matroska。形式を決めるのはこのフィールドで、ファイル形式判定が 4 バイトではなく最低 32 バイトを読まなければならない理由でもあります。 |
| 32 | 4 | DocTypeVersion element | 42 87 81 04。書き手が使った Matroska の要素セットの改訂版で、4 なら現行の muxer が頼っている追加要素をおおむねカバーします。リーダーは見慣れない要素を読み飛ばすことが期待されていて、ファイルを拒否すべきではありません。 |
| 36 | 4 | DocTypeReadVersion element | 42 85 81 02。そもそもファイルを解析するために必要な最低限の改訂版です。上のバージョンよりわざと低くしてあり、古いリーダーを締め出さないようになっています。 |
| 40 | 4 | Segment element ID | 18 53 80 67。ファイル本体をまるごと収めるマスター要素で、トラック定義、フレームのクラスタ、キュー索引、チャプター、タグ、添付ファイルが入ります。サイズが直後に続き、まだ書き込み中のファイルでは未定サイズの形になります。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| WebM | 同じ符号化で、オフセット 24 の名前が違うだけです。matroska か webm か。1 バイト手前のほうが速く、オフセット 23 の DocType 長がこちらは 88、あちらは 84 です。同じ理由でオフセット 4 の EBML ヘッダサイズも A3 と 9F に分かれます。実際に効くのはコーデックです。Matroska は H.264・HEVC・AC-3・DTS・TrueHD を運びますが、WebM と名乗るファイルからそれらをブラウザがデコードすることはありません。 |
| MKA | .mka は音声だけを持つ Matroska ファイル、.mks は字幕だけ、.mk3d は立体視のものです。どれもヘッダに見分けのつくバイトを持ちません。DocType はどの場合も matroska です。つまり拡張子は中身についての書き手の主張であって、真実が記録されているのは Tracks 要素だけです。 |
| MP4 | 構造上は無関係です。MP4 はビッグエンディアン 32 ビットのサイズを持つボックスの木で、オフセット 4 に ftyp。Matroska は識別子もサイズも可変長の EBML で、マジックはオフセット 0 です。どちらも H.264 と AAC を持てて、相互の remux が可逆コピーになるので絶えず比較されますが、バイトの上で共有しているものは何ひとつありません。 |
| AVI | Matroska が置き換えるために作られたコンテナです。AVI はリトルエンディアンのサイズを持つ RIFF で、52 49 46 46 で始まりオフセット 8 が AVI。可変フレームレート、今どきの音声、字幕、トラックごとの言語のいずれもまともに扱えません。AVI から MKV へ remux したファイルは、同じ圧縮フレームを保ったままそれら全部を手に入れます。 |
よくある壊れ方
- 未定の Segment サイズが後から埋められなかった場合。パイプやライブソースへ書く muxer は、EBML がまさにこのために定めたすべて 1 の形で Segment サイズ整数の値ビットを埋め、終了時に戻って本当の長さを書くことになっています。途中で殺されればそれは起きません。残るのは、最初から再生はできて再生時間を報告せず、シークもできないファイルです。
- Cues 要素の欠落。シーク索引は通常 Segment の先頭か末尾に置かれ、ライブで録ったものからは単純に消えています。プレイヤーはクラスタを走査するフォールバックに落ち、大きなファイルでは遅くて不正確です。素直に remux すれば、1 フレームも再圧縮せずにきちんとした索引が書かれます。
- 途中切れ。どの要素も自分の長さを述べるので、リーダーは最後の完全なクラスタまできれいに歩き、そこで存在しないバイトを約束するサイズに出会います。そこまでを表示して止まるプレイヤーもあれば、ファイル全体を破損と呼ぶものもあります。途中までダウンロードした MKV が、あるツールでは開けて別のツールでは開けないのはこのためです。
- 字幕テキストのエンコーディングの誤り。コンテナはトラックごとに CodecID と言語を記録しますが、古いテキスト形式については信頼できる文字エンコーディングを記録しません。Big5・GBK・Shift_JIS で書かれた字幕トラックを UTF-8 として読めば文字化けします。映像と音声のバイトはすべて完璧なままです。
- 要素識別子の破損。識別子もサイズもどちらも可変長なので、サイズフィールドのバイトが 1 つ反転しただけで、パーサはフレームの真ん中へ飛び込んでゴミを次の要素として読みます。クラスタが再同期するのでファイル自体は再生できることが多いのですが、厳格なパーサは反転した箇所で止まり、それ以降をすべて読めないものとして報告します。
この形式の現在地
Matroska は、動画を配るためではなく取っておくための場所です。複数言語の音声、複数の字幕トラック、チャプター、埋め込みフォントを抱えたものはたいてい MKV です。その組み合わせを文句なく扱えるコンテナが他になく、しかもここへの remux は再エンコードではなくフレームの可逆コピーだからです。エンコードツールの作業形式でもあるので、中身が MP4 にきれいに収まる場合でも .mkv として出てきます。負けているのは到達範囲です。再生できるブラウザはなく、iOS も大半のテレビも受け付けず、ハードウェアプレイヤーの対応もばらつきが大きいので、人に送るものの安全な答えは今も MP4 です。よくあるやり方は Matroska で保管して MP4 に書き出すことで、中の映像には手を触れないため、その書き出しは画質の劣化ではなくコンテナの入れ替えになります。
Matroska ファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
Matroska と混同しやすい形式です。先頭バイトを見比べてください。