FLAC ファイル形式
Free Lossless Audio Codec。可逆圧縮の音声形式。
- MIME タイプ
- audio/flac
- 拡張子
- .flac
- カテゴリ
- 音声
マジックナンバー(ファイル署名)
| 0x00000000 | 664C6143 | fLaC | 'fLaC' stream marker |
FLAC 形式について
FLAC は何も捨てずに音声を圧縮し、通常は元の半分から 70 パーセント程度になります。デコードすれば入れたときとまったく同じサンプルが戻ってきます。仕組みは、音声のブロックごとに短い予測器を当てはめて残差だけを保存するというもので、逆変換は安価で浮動小数点演算をまったく必要としません。デコーダは非力なハードウェアでも十分速く動きます。ファイルは 4 バイトのマーカー、メタデータブロックの連なり、そして音声フレームという構成です。最初のメタデータブロックは必ず STREAMINFO で、1 サンプルもデコードする前にプレイヤーが準備に必要とするものがすべて入っています。元音声の MD5 ダイジェストもそこにあり、何年も経ってからデコードがビット単位で正しかったことを証明できます。
ヘッダーの構造(バイト単位)
| オフセット | 長さ | フィールド | 意味 |
|---|---|---|---|
| 0 | 4 | Stream marker | 66 4C 61 43、ASCII の fLaC で、大文字小文字もこのとおりです。これがマジックナンバーのすべてで、多くの音声形式と違って本当にオフセット 0 にあります。FLAC の仕様は、この手前にメタデータタグを書くことを許していません。 |
| 4 | 1 | First metadata block header | 最上位ビットが last-metadata-block フラグ、下位 7 ビットがブロック型です。このバイトは 00 か 80 にしかなりえません。仕様が最初のブロックを型 0 の STREAMINFO と定めているからです。80 なら、他のメタデータがまったく無いファイルということになります。 |
| 5 | 3 | STREAMINFO length | 後続するブロックのバイト数をビッグエンディアン 24 ビットで表したもので、常に 00 00 22、つまり 34 バイトです。他のメタデータブロックはここが可変長ですが、これだけは違うので、怪しいファイルの妥当性チェックに使えます。 |
| 8 | 2 | Minimum block size | どのフレームにも含まれるサンプル数の最小値をビッグエンディアンで、最低 16 です。下の最大値と等しければ全フレームが同じ長さということで、シーク位置は表を引かずに算術で求められます。 |
| 10 | 2 | Maximum block size | どのフレームにも含まれるサンプル数の最大値をビッグエンディアンで、上限は 65535 です。リファレンスエンコーダは大半のサンプリング周波数で 4096 を使うので 10 00 と読めます。12 00 なら 4608 です。 |
| 12 | 3 | Minimum frame size | ストリーム中で最小のフレームのバイト数をビッグエンディアン 24 ビットで。0 も合法で、エンコーダが記録しなかったことを意味します。ヘッダを埋め直しに戻ってこなかったストリーミングの書き手が残すのがこれです。 |
| 15 | 3 | Maximum frame size | ストリーム中で最大のフレームをバイト数で、符号化は同じ、不明なら 0 です。デコーダはこの 2 つを使って、推測せずに入力バッファのサイズを決めます。 |
| 18 | 8 | Packed audio parameters | バイト境界をまったく尊重しない 64 ビットです。サンプリング周波数を Hz で 20 ビット、チャンネル数マイナス 1 を 3 ビット、ビット深度マイナス 1 を 5 ビット、そして総サンプル数を 36 ビット。周波数 0A C4 4 は 44100 です。周波数 0 は不正で、総サンプル数 0 はファイルを書いたときに長さが分かっていなかったことを意味します。 |
| 26 | 16 | MD5 of the unencoded audio | 圧縮前の生サンプルのダイジェストです。verify を走らせたときにデコード結果と突き合わせるのがこれで、FLAC がリッピングをディスクとビット単位で同一だと証明できるのは、単に再生できるからではなくこの値があるからです。全部 0 ならエンコーダが計算を見送ったということで、これに立脚した保証はすべて消えます。 |
| 42 | 4 | Second 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 で、最終ブロックフラグが立っていないのでこの後にまだブロックが続きます。 |
似た形式との見分け方
| 紛らわしい形式 | 見分け方 |
|---|---|
| Ogg | FLAC はネイティブ形式のほかに 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 に見えてしまいます。 |
| ALAC | Apple の可逆コーデックで、可逆ライブラリがどちらの形でも届きうる理由です。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 と混同しやすい形式です。先頭バイトを見比べてください。