M4A ファイル形式
MPEG-4 音声。通常は AAC エンコードで、ISO-BMFF コンテナに入っています。
- MIME タイプ
- audio/mp4
- 拡張子
- .m4a
- カテゴリ
- 音声
マジックナンバー(ファイル署名)
| 0x00000004 | 66747970 | ftyp | ISO-BMFF 'ftyp' box |
| 0x00000008 | 4D344120 | M4A | brand 'M4A ' |
M4A 形式について
M4A は AAC(または ALAC)音声を MP4 コンテナに収めたもので、iTunes と Apple Music がダウンロードに使う形式です。ISO-BMFF ファイルで、ftyp ブランドは M4A です。ISO-BMFF はボックスの木構造で、各ボックスはビッグエンディアン 32 ビットのサイズに 4 文字の型が続く形をしています。構造の文法はそれだけです。ftyp がこのファイルの話す方言を宣言し、moov が再生を可能にする索引で、mdat が符号化されたフレームを持ちます。索引がデータとは別のボックスになっているため、M4A はバイト単位で完全に無傷でも、片方の端が欠けていれば再生できません。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | ftyp box size | ビッグエンディアンです。ここは強調しておく価値があります。ISO-BMFF ファイルの中身はすべてビッグエンディアンで、RIFF とは正反対です。典型的な値は 00 00 00 1C、28 バイトです。サイズが 1 なら型フィールドの後ろに 64 ビットの largesize が続き、0 ならボックスはファイル末尾まで伸びます。 |
| 4 | 4 | Box type 'ftyp' | 66 74 79 70。サイズが先に来るのでオフセット 0 ではなく 4 にあります。MP4 系の検出器がどれも 4 バイト目から照合するのはこのためで、このファミリーにファイル先頭のマジックナンバーが存在しないのもこのためです。 |
| 8 | 4 | Major brand | 4D 34 41 20。M4A の 3 文字に末尾のスペースで、ブランドは常に 4 文字だからです。M4A、MP4(isom や mp42)、M4V、3GP(3gp4)、AVIF(avif)、HEIC(heic)を分けているのは、このフィールドただ 1 つです。 |
| 12 | 4 | Minor version | ファイル形式ではなくブランドのバージョン番号をビッグエンディアンで。Apple 系のファイルは伝統的に 00 00 02 00、つまり 512 を持ちます。リーダーは互換性の関門として扱わず無視するよう言われています。 |
| 16 | variable | Compatible brands | ftyp ボックスの残りを埋める 4 バイトブランドのリストで、よくあるのは M4A、isom、iso2 です。メジャーブランドを認識できないプレイヤーも、このリストの中に認識できるブランドがあれば再生してよいことになっていて、新しい形式が古いソフトウェアでも開ける状態を保てるのはこの仕組みのおかげです。 |
| variable | 8 | Next box header | ftyp のサイズが述べた位置から始まります。major brand ひとつに compatible brands 三つという普通の構成なら 28 です。中身はまた 4 バイトのサイズと 4 バイトの型。実際のファイルは次に free・moov・mdat のいずれかを置くので、ftyp ボックスから先に固定のオフセットはありません。 |
| variable | variable | 'moov' box | 索引です。トラック一覧、タイムスケール、再生時間、コーデック設定、そしてすべてのフレームをバイトオフセットとタイムスタンプに対応づけるサンプルテーブルが入っています。これが無ければ何も再生できず、しかも合法的にファイルのどちらの端にあっても構いません。 |
| variable | variable | 'mdat' box | 符号化された音声フレームそのもので、内部に索引はありません。ただのバイト列で、意味を与えるのは moov のサンプルテーブルだけです。位置そのものも固定ではありません。28 バイトの ftyp の後ろに 8 バイトの free ボックスが入れば mdat はオフセット 36 から始まり、moov は mdat の長さが尽きたところから始まります。 |
| variable | 4 | Codec four-character code inside 'moov' | サンプル記述の奥に埋まっています。AAC なら mp4a、Apple Lossless なら alac。ブランドが M4A のファイルではどちらも合法なので、ブランドはコンテナの方言を教え、こちらは音声が実際に何なのかを教えます。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| MP4 | 先頭 8 バイトはバイト単位で同一で、それ以降も構造として同一です。違いはオフセット 8 のブランドがすべてで、M4A か、isom・mp42 かです。さらに厄介なことに、音声だけのファイルがブランド isom で書かれていることも多いので、ブランドだけでは映像が無い証明になりません。それを知るには moov まで歩いてトラックを数えるしかありません。 |
| QuickTime Movie | QuickTime は ISO-BMFF が標準化される元になった形式なので、ボックスの文法は同じです。今どきの .mov はオフセット 8 に末尾スペース 2 つの qt、71 74 20 20 を持ち、たいてい ftyp の直後に wide ボックスがあります。これは MP4 の書き手が出力しないものです。その組み合わせが確実な手がかりになります。 |
| 3GP | こちらも同じコンテナで、オフセット 8 のブランドが 3gp4・3gp5・3gpp です。実務上の違いは中に何を入れてよいかで、3GP のプロファイルはコーデックを移動体通信網が合意した範囲に制限します。したがって構造としては正しい MP4 でも、3GP しか受け付けないデコーダには拒否されることがあります。 |
| ADTS AAC | 生の .aac ファイルにはボックスがまったくありません。ADTS フレームが並んだだけのもので、各フレームは 12 ビットの同期ワードで始まるため、ファイルは FF F1 か FF F9 で始まります。音声としては M4A が運ぶのとまったく同じ AAC ビットストリームでありうるのですが、ftyp も moov もシークテーブルも無いので、ファイルとしてはまるで別物です。 |
| MP3 | どちらも買ってきた圧縮音声なので絶えず混同されますが、MP3 は ID3 タグかフレーム同期で始まる素のフレーム列で、コンテナもサンプルテーブルも無く、ID3 タグの外でカバーアートを運ぶ標準的な手段もありません。先頭 16 バイトに ISO-BMFF のボックスらしさは何ひとつありません。 |
よくある壊れ方
- 索引が反対の端にあるうえにダウンロードが途中で切れた場合。エンコーダは指示しない限り mdat を先に、moov を最後に書くので、95 パーセントで止まったダウンロードには音声のほぼ全部と索引ゼロが入っていて、1 秒たりとも再生できません。faststart のパスを走らせると moov が前に移ります。ストリーミングサーバがそれを要求するのはこのためです。
- mdat より前でバイトが増えたり減ったりした場合。サンプルテーブルは絶対ファイルオフセットを保持しているので、先頭に ID3 タグを貼ったり、はぐれた接頭バイトを削ったりすると、フレームへのポインタが一斉にずれます。リーダーがずれ量を計算し直せる ZIP と違って、MP4 はオフセットが動いたことを何も知らせません。再生するとノイズが出るか、何も出ないだけです。
- ボックスサイズが 8 未満だったり、ファイルの途中で 0 だったりする場合。このフィールドを信じるパーサは、長さ 0 のボックスで無限ループするか、バッファの外へ歩き出します。堅牢なリーダーは 8 未満のサイズを即座に拒否します。メディアライブラリに対する古典的なファジングの標的でもあります。
- 4 ギガバイトのチャンクオフセットの壁。通常のチャンクオフセットテーブルは 32 ビットなので、4 ギガバイトを超えるファイルには 64 ビット版が必要です。それを出力しない書き手は、後半のオフセットが回り込むファイルを作り、長い録音の途中で再生が唐突に壊れます。
- テキストモード転送。符号化されたフレームの内部で改行が変換されても、ボックスの木構造は完璧に解析できるままなので、ファイルは正しい再生時間とコーデックを報告したうえでノイズを鳴らします。破損がすべて mdat の中にあるため、メタデータには一切傷が付きません。
この形式の現在地
今どき購入したりストリーミングで聴いたりする音楽の実体は M4A です。Apple が iTunes のダウンロード形式として作ったもので、MP4 コンテナの中の AAC は今や Apple のエコシステム、YouTube の音声トラック、大半のポッドキャストのフィード、そして主要なスマートフォン 2 種のボイスメモの既定になっています。可逆の層は同じコンテナの中の ALAC が担当します。新しいものについては事実上すべてで MP3 を置き換えました。同じビットレートで AAC のほうが意味のある差で優れていること、そして末尾に貼り付けたタグではなく、本物のメタデータ・チャプター・カバーアートをコンテナが持ち込むことが理由です。第一候補にならないのは、遅延に敏感なものとオープンなスタックです。Ogg や WebM の中の Opus は低ビットレートで AAC に勝ち、ライセンスの荷物も無いので、音声チャットと WebRTC はそちらへ行きました。制作の現場では M4A を直接編集する人はいません。WAV にデコードして編集し、最後に一度だけ再エンコードします。AAC は非可逆で、再エンコードのたびに劣化が積み重なるからです。
M4A ファイルをこのサイトで開く
どれもブラウザ内で動きます。ファイルが端末から出ることはありません。
関連する形式
M4A と混同しやすい形式です。先頭バイトを見比べてください。