ByteScope

M4A ファイル形式

MPEG-4 音声。通常は AAC エンコードで、ISO-BMFF コンテナに入っています。

MIME タイプ
audio/mp4
拡張子
.m4a
カテゴリ
音声

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

0x0000000466747970ftypISO-BMFF 'ftyp' box
0x000000084D344120M4A brand 'M4A '

M4A 形式について

M4A は AAC(または ALAC)音声を MP4 コンテナに収めたもので、iTunes と Apple Music がダウンロードに使う形式です。ISO-BMFF ファイルで、ftyp ブランドは M4A です。ISO-BMFF はボックスの木構造で、各ボックスはビッグエンディアン 32 ビットのサイズに 4 文字の型が続く形をしています。構造の文法はそれだけです。ftyp がこのファイルの話す方言を宣言し、moov が再生を可能にする索引で、mdat が符号化されたフレームを持ちます。索引がデータとは別のボックスになっているため、M4A はバイト単位で完全に無傷でも、片方の端が欠けていれば再生できません。

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

オフセット長さフィールド意味
04ftyp box sizeビッグエンディアンです。ここは強調しておく価値があります。ISO-BMFF ファイルの中身はすべてビッグエンディアンで、RIFF とは正反対です。典型的な値は 00 00 00 1C、28 バイトです。サイズが 1 なら型フィールドの後ろに 64 ビットの largesize が続き、0 ならボックスはファイル末尾まで伸びます。
44Box type 'ftyp'66 74 79 70。サイズが先に来るのでオフセット 0 ではなく 4 にあります。MP4 系の検出器がどれも 4 バイト目から照合するのはこのためで、このファミリーにファイル先頭のマジックナンバーが存在しないのもこのためです。
84Major brand4D 34 41 20。M4A の 3 文字に末尾のスペースで、ブランドは常に 4 文字だからです。M4A、MP4(isom や mp42)、M4V、3GP(3gp4)、AVIF(avif)、HEIC(heic)を分けているのは、このフィールドただ 1 つです。
124Minor versionファイル形式ではなくブランドのバージョン番号をビッグエンディアンで。Apple 系のファイルは伝統的に 00 00 02 00、つまり 512 を持ちます。リーダーは互換性の関門として扱わず無視するよう言われています。
16variableCompatible brandsftyp ボックスの残りを埋める 4 バイトブランドのリストで、よくあるのは M4A、isom、iso2 です。メジャーブランドを認識できないプレイヤーも、このリストの中に認識できるブランドがあれば再生してよいことになっていて、新しい形式が古いソフトウェアでも開ける状態を保てるのはこの仕組みのおかげです。
variable8Next box headerftyp のサイズが述べた位置から始まります。major brand ひとつに compatible brands 三つという普通の構成なら 28 です。中身はまた 4 バイトのサイズと 4 バイトの型。実際のファイルは次に free・moov・mdat のいずれかを置くので、ftyp ボックスから先に固定のオフセットはありません。
variablevariable'moov' box索引です。トラック一覧、タイムスケール、再生時間、コーデック設定、そしてすべてのフレームをバイトオフセットとタイムスタンプに対応づけるサンプルテーブルが入っています。これが無ければ何も再生できず、しかも合法的にファイルのどちらの端にあっても構いません。
variablevariable'mdat' box符号化された音声フレームそのもので、内部に索引はありません。ただのバイト列で、意味を与えるのは moov のサンプルテーブルだけです。位置そのものも固定ではありません。28 バイトの ftyp の後ろに 8 バイトの free ボックスが入れば mdat はオフセット 36 から始まり、moov は mdat の長さが尽きたところから始まります。
variable4Codec four-character code inside 'moov'サンプル記述の奥に埋まっています。AAC なら mp4a、Apple Lossless なら alac。ブランドが M4A のファイルではどちらも合法なので、ブランドはコンテナの方言を教え、こちらは音声が実際に何なのかを教えます。

似た形式との見分け方

紛らわしい形式見分け方
MP4先頭 8 バイトはバイト単位で同一で、それ以降も構造として同一です。違いはオフセット 8 のブランドがすべてで、M4A か、isom・mp42 かです。さらに厄介なことに、音声だけのファイルがブランド isom で書かれていることも多いので、ブランドだけでは映像が無い証明になりません。それを知るには moov まで歩いてトラックを数えるしかありません。
QuickTime MovieQuickTime は 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 と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
MP349 44 33.mp3
MP466 74 79 70.mp4
FLAC66 4C 61 43.flac

よくある質問

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

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

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