ByteScope

FLAC ファイル形式

Free Lossless Audio Codec。可逆圧縮の音声形式。

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

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

0x00000000664C6143fLaC'fLaC' stream marker

FLAC 形式について

FLAC は何も捨てずに音声を圧縮し、通常は元の半分から 70 パーセント程度になります。デコードすれば入れたときとまったく同じサンプルが戻ってきます。仕組みは、音声のブロックごとに短い予測器を当てはめて残差だけを保存するというもので、逆変換は安価で浮動小数点演算をまったく必要としません。デコーダは非力なハードウェアでも十分速く動きます。ファイルは 4 バイトのマーカー、メタデータブロックの連なり、そして音声フレームという構成です。最初のメタデータブロックは必ず STREAMINFO で、1 サンプルもデコードする前にプレイヤーが準備に必要とするものがすべて入っています。元音声の MD5 ダイジェストもそこにあり、何年も経ってからデコードがビット単位で正しかったことを証明できます。

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

オフセット長さフィールド意味
04Stream marker66 4C 61 43、ASCII の fLaC で、大文字小文字もこのとおりです。これがマジックナンバーのすべてで、多くの音声形式と違って本当にオフセット 0 にあります。FLAC の仕様は、この手前にメタデータタグを書くことを許していません。
41First metadata block header最上位ビットが last-metadata-block フラグ、下位 7 ビットがブロック型です。このバイトは 00 か 80 にしかなりえません。仕様が最初のブロックを型 0 の STREAMINFO と定めているからです。80 なら、他のメタデータがまったく無いファイルということになります。
53STREAMINFO length後続するブロックのバイト数をビッグエンディアン 24 ビットで表したもので、常に 00 00 22、つまり 34 バイトです。他のメタデータブロックはここが可変長ですが、これだけは違うので、怪しいファイルの妥当性チェックに使えます。
82Minimum block sizeどのフレームにも含まれるサンプル数の最小値をビッグエンディアンで、最低 16 です。下の最大値と等しければ全フレームが同じ長さということで、シーク位置は表を引かずに算術で求められます。
102Maximum block sizeどのフレームにも含まれるサンプル数の最大値をビッグエンディアンで、上限は 65535 です。リファレンスエンコーダは大半のサンプリング周波数で 4096 を使うので 10 00 と読めます。12 00 なら 4608 です。
123Minimum frame sizeストリーム中で最小のフレームのバイト数をビッグエンディアン 24 ビットで。0 も合法で、エンコーダが記録しなかったことを意味します。ヘッダを埋め直しに戻ってこなかったストリーミングの書き手が残すのがこれです。
153Maximum frame sizeストリーム中で最大のフレームをバイト数で、符号化は同じ、不明なら 0 です。デコーダはこの 2 つを使って、推測せずに入力バッファのサイズを決めます。
188Packed audio parametersバイト境界をまったく尊重しない 64 ビットです。サンプリング周波数を Hz で 20 ビット、チャンネル数マイナス 1 を 3 ビット、ビット深度マイナス 1 を 5 ビット、そして総サンプル数を 36 ビット。周波数 0A C4 4 は 44100 です。周波数 0 は不正で、総サンプル数 0 はファイルを書いたときに長さが分かっていなかったことを意味します。
2616MD5 of the unencoded audio圧縮前の生サンプルのダイジェストです。verify を走らせたときにデコード結果と突き合わせるのがこれで、FLAC がリッピングをディスクとビット単位で同一だと証明できるのは、単に再生できるからではなくこの値があるからです。全部 0 ならエンコーダが計算を見送ったということで、これに立脚した保証はすべて消えます。
424Second metadata block header同じ 1 バイトのフラグ兼型に 24 ビットの長さが続く形で、STREAMINFO が常にちょうど 34 バイトなのでオフセットは固定です。型は 0 が STREAMINFO、1 が PADDING、2 が APPLICATION、3 が SEEKTABLE、4 が VORBIS_COMMENT、5 が CUESHEET、6 が PICTURE。04 00 00 2E と読めれば 46 バイトの Vorbis comment で、最終ブロックフラグが立っていないのでこの後にまだブロックが続きます。

似た形式との見分け方

紛らわしい形式見分け方
OggFLAC はネイティブ形式のほかに Ogg コンテナに入れて運ぶこともでき、それを収めた .oga や .ogg ファイルはオフセット 0 が Ogg のページマーカー 4F 67 67 53、つまり OggS で始まります。fLaC の文字列も数十バイト先の最初のパケットの中に現れるので、オフセット 0 を検査せずにマーカーを走査する検出器は、Ogg ファイルをネイティブ FLAC と呼んでしまいます。
WAV人が実際に比較する相手です。どちらも可逆で、同じサンプルを保持します。WAV は RIFF で、52 49 46 46 で始まりオフセット 8 のフォームタイプが WAVE、PCM を無圧縮で格納し、32 ビットのサイズフィールドがファイルを 4 GB で頭打ちにします。FLAC は同じ音声をおよそ半分の容量に収め、まともなタグ付けを備え、あとで検証できる MD5 を持ちます。
MP3バイトレベルでは、読める fLaC と ID3 タグやフレーム同期という違いで紛らわしさはありませんが、片方向に本物の失敗モードがあります。一部のタグ付けソフトは、仕様が禁じているにもかかわらず FLAC ファイルの先頭に ID3v2 タグを書きます。これでマーカーがオフセット 0 から押し出され、先に 49 44 33 を調べるものからは MP3 に見えてしまいます。
ALACApple の可逆コーデックで、可逆ライブラリがどちらの形でも届きうる理由です。ALAC は MP4 コンテナの中に住むので、ファイルはオフセット 4 の ftyp ボックスから始まり、拡張子はたいてい .m4a です。fLaC マーカーはどこにもありません。両者の変換は同じサンプルを本当に再エンコードする処理ですが、どちらも可逆なので音質は変わりません。

よくある壊れ方

  • 途中切れ。切られた FLAC は欠けたバイトの直前まできれいにデコードしてそのまま終わるので、再生できたことは何の証明にもなりません。捕まえるのはオフセット 26 の MD5 です。完全な verify は全サンプルをデコードしてダイジェストを比較します。古いバックアップから出てきたファイルが今も当時のままかを知る方法は、これしかありません。
  • MD5 が全部 0 のケース。一部のエンコーダと大半のストリーミングの書き手はダイジェストの計算を省き、オフセット 26 に 16 バイトのゼロを残します。音声はまったく問題なくファイルも正しいのに、FLAC が与えてくれると人が信じている完全性の保証だけが静かに欠けています。そういうファイルへの verify は、フレームの CRC を確認できても中身までは確認できません。
  • 総サンプル数が 0 のケース。オフセット 18 のパックされたパラメータの中の 36 ビットフィールドは、エンコード完了時に書き戻されます。パイプへ書いたものや中断したものは 0 のままです。ファイルは問題なく再生でき、再生時間だけ報告されません。プレイヤーは時間欄を空白にするか、ファイル全体を走査して割り出します。
  • フレーム内のバイト反転。各フレームは自分の CRC-16 を持つので、デコーダは破損を検出してそのフレームを捨てるか、クリックノイズを出します。残りのストリームは無傷のまま続きます。少し壊れた FLAC が最後まで再生できるのはこのためで、失敗が拒否ではなく可聴のアーティファクト 1 つとして現れるのもこのためです。
  • 雑なタグ付けソフトが前に付けた ID3v2 タグ。仕様はオフセット 0 に fLaC を要求していますが、それでも手前に ID3 ヘッダを書くソフトがあります。厳格なデコーダはファイルを門前払いし、寛容なものは前方を走査して再生し、検出器は MP3 と判定します。音声はまったく無傷のファイルなのに、です。

この形式の現在地

Apple のエコシステムの外では、可逆音声とは実質 FLAC のことです。CD のリッピング、Bandcamp や Qobuz のハイレゾ配信、保管用のマスター、あとでトランスコードする前提のものはすべてこれに収まります。特許もライセンスも無く、大したことのないハードウェアでもデコードが速く、2016 年ごろからすべてのブラウザが対応しているからです。真剣な競合は ALAC だけで、こちらは MP4 コンテナの中で同じ仕事を同じ結果でこなします。存在理由の大半は Apple が自前のものを欲しがったことです。WavPack と Monkey's Audio には少数の支持者がいますが到達範囲はありません。FLAC は MP3・AAC・Opus とはそもそも競合していません。サイズが 2〜5 倍あり、配信用に作られていないからです。理にかなうやり方は FLAC をマスターとして持っておき、必要になったときに非可逆コピーを生成することです。非可逆コピーはいつでも作り直せますが、それを作るために捨てた情報は二度と戻りません。

FLAC ファイルをこのサイトで開く

どれもブラウザ内で動きます。ファイルが端末から出ることはありません。

関連する形式

FLAC と混同しやすい形式です。先頭バイトを見比べてください。

形式先頭バイト拡張子
WAV52 49 46 46.wav
MP349 44 33.mp3
Ogg4F 67 67 53.ogg
M4A66 74 79 70.m4a

よくある質問

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

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

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