ByteScope

Matroska ファイル形式

Matroska。ほぼあらゆるコーデックを収められるオープンなコンテナ。

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

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

0x000000001A45DFA3·E··EBML header

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

Matroska 形式について

Matroska は、何でも入れられることを目指したオープンなコンテナです。どんな映像コーデックでも、どんな音声コーデックでも、いくつでも字幕トラックを、そしてチャプター、添付ファイル、タグ、トラックごとの言語をすべて 1 ファイルに収められます。土台は EBML で、これは XML に似た形のバイナリ符号化です。どの要素も可変長の識別子、可変長のサイズ、そして値か入れ子の要素という並びになっています。サイズが暗黙ではなく明示されているので、Matroska ファイルは中の要素をひとつも理解しないまま歩けますし、リーダーは知らないものを読み飛ばせます。WebM はコーデック一覧を絞っただけの同じ符号化なので、両者は先頭 21 バイトまで同一で、違うのは形式を名乗る DocType 文字列だけです。

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

オフセット長さフィールド意味
04EBML master element ID1A 45 DF A3。マジックナンバーであり、慣習ではなく仕様によって位置が固定されているファイル中唯一のフィールドです。WebM もここにまったく同じ 4 バイトを持ちます。
41EBML header size可変長整数で、先頭の 1 ビットが 1 バイト長であることを示し、残り 7 ビットがヘッダ本体のサイズになります。Matroska ファイルでは A3 で 35、WebM では 9F で 31 です。この 4 の差は matroska と webm の文字数の差です。書き手はこの整数を最大 8 バイトまでパディングして構いません。
54EBMLVersion element42 86 81 01。要素 ID、サイズ 1、値 1 という並びです。このヘッダの要素はどれも既定値を持ち、合法的に省略できるので、以下のオフセットは仕様が保証する配置ではなく、普通の書き手が出力する形を述べたものです。
94EBMLReadVersion element42 F7 81 01。ファイルを解析するためにリーダーが実装していなければならない EBML の最低バージョンです。1 から動いたことがありません。
134EBMLMaxIDLength element42 F2 81 04。このファイルのどこかで使われる要素識別子の最大長で、実際には 4 バイト。パーサが処理を始める前にバッファサイズを固定できます。
174EBMLMaxSizeLength element42 F3 81 08。ファイル中のサイズフィールドの最大長です。8 が通例で、ライブ書き込み中の Segment に付く未定サイズのマーカーが 8 バイト幅になるのはこの値のためです。
212DocType element ID42 82。ファイルが実際にどの EBML ベース形式なのかを名乗ります。Matroska ファイルを先頭 20 バイトで WebM と区別できない、唯一の理由です。
231DocType length88。1 バイトの可変長整数で値は 8、続く文字列の長さです。WebM は 4 文字の名前なのでここが 84 になり、この位置より後ろのオフセットは 2 つの形式で 4 ずれます。
248DocType value6D 61 74 72 6F 73 6B 61、ASCII の matroska。形式を決めるのはこのフィールドで、ファイル形式判定が 4 バイトではなく最低 32 バイトを読まなければならない理由でもあります。
324DocTypeVersion element42 87 81 04。書き手が使った Matroska の要素セットの改訂版で、4 なら現行の muxer が頼っている追加要素をおおむねカバーします。リーダーは見慣れない要素を読み飛ばすことが期待されていて、ファイルを拒否すべきではありません。
364DocTypeReadVersion element42 85 81 02。そもそもファイルを解析するために必要な最低限の改訂版です。上のバージョンよりわざと低くしてあり、古いリーダーを締め出さないようになっています。
404Segment element ID18 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 が可逆コピーになるので絶えず比較されますが、バイトの上で共有しているものは何ひとつありません。
AVIMatroska が置き換えるために作られたコンテナです。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 と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
WebM1A 45 DF A3.webm
MP466 74 79 70.mp4
AVI52 49 46 46.avi

よくある質問

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

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

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