前回の記事で、不可逆圧縮のAACやMP3のビットレート変動を紹介しましたが、今回はFLAC(Free Lossless Audio Codec)とALAC(Apple Lossless Audio Codec)という2つのロスレス圧縮フォーマット(可逆圧縮)におけるビットレートの変動(振る舞い)を可視化し、その違いを紹介します。
FLACとALACフォーマットの基本的な違い
FLAC:オープンソースのロスレス圧縮フォーマットで、PCやAndroidデバイスをはじめとする多くのプラットフォームでサポートされています。 圧縮レベルを指定するオプションがあります。 ファイルの拡張子は、✗✗✗✗.flac になります。
ALAC:Appleが開発したロスレス圧縮フォーマットで、圧縮レベルを指定するオプションは通常ありません。(VinylStudioソフトでは、圧縮レベルを指定可) これは、主にApple製品に最適化されApple Musicなどのサービスと一貫性をもたせるため、1つの固定された圧縮方式にしているためと思われます。 なお、ファイルの拡張子は、AACと同じ、✗✗✗✗.m4a になります。
FLAC及びALACに変換する元の音声ファイルについて
1959年録音のカラヤンとベルリン・フィルが演奏した「ドヴォルザークのスラヴ舞曲第1番ハ長調 Op.46-1」CD音源(=リッピングしたFlac 16bit 44.1khzファイル)をWAVに変換した音源ファイルを使います。
『スラヴ舞曲第1番』は、比較的シンプルでありながらリズム感が重要な楽曲です。途中で静かな部分と力強い部分が交互に現れるため、圧縮アルゴリズムの挙動を確認するには最適なトラックです。
FLAC及びALACにエンコード(変換)する(テスト条件)
エンコーダは、macOS用のXLDアプリ【バージョン20230627 (156.1)】を使いました。
入力ファイルをFLAC又はALAC(=Apple Lossless)を出力(エンコード)するには、XLDの環境設定の出力フォーマットから選択します。
FLACの場合、オプションボタンを押すと、圧縮レベル【無圧縮と圧縮レベル(0〜8)】を設定できます。
今回のテストでは、「無圧縮」「標準」「高圧縮」の3種類の設定でFLACを出力します。
今回ビットレート変動をテストするために、前述の「ドヴォルザークのスラヴ舞曲第1番ハ長調 Op.46-1」WAV音源を以下のFLAC(3種類)及びALAC(1種類)をXLDで変換しました。
MediaInfoによるファイル諸元
項目 | WAV | 無圧縮FLAC | 標準FLAC | 高圧縮FLAC | ALAC |
ビットレート種別 | CBR | VBR | VBR | VBR | VBR |
ビットレート | 1,411Kbps | 1,415Kbps | 758Kbps | 697Kbps | 722Kbps |
Finder調べFile size | 37.6MB | 37.7MB | 20.2MB | 18.6MB | 19.2MB |
圧縮率 | 100% | 100% | 54% | 49% | 51% |
サンプルレート | 44.1khz | ||||
ビット深度 | 16bit |
フレーム単位のビットレートの変動データの取得とグラフ化する方法
FLACやALACなどの圧縮ファイルは、ある程度のサンプル(サンプリング)数をまとめてフレームとして処理しますので、FFmpegのashowinfoを使えば、フレーム単位でビットレート情報を得ることができます。
具体的には、"input_file"にFLAC(or ALAC)ファイルを記述して、下のコマンドラインをターミナルから実行すると、フレーム順に、「フレーム番号」「秒単位の累積タイム」「累積バイト数」などのデータを取得できます。
bash command
ffmpeg -i "input_file" -af "ashowinfo" -f null - 2>&1
このフレームデータを、CSVファイルに落とし、このCSVファイルをグラフ化(可視化)するまでの手順は下の記事を参照してください。
-
参 照音声ファイルをFFmpegのashowinfo を使ってフレーム単位でビットレート情報を収集しグラフ化する方法
前回投稿は、音声ファイルの「秒単位のビットレート」をグラフ化するので横軸(時間軸)分解能に関して難点がありました。 今回は、グラフの分解能を上げるためFFmpegの ashowinfo を使って「フ ...
FLACとALACファイルのビットレート変動(振る舞い)をご覧ください
FLACファイル
上のグラフは音声ファイルのWave波形と、圧縮レベルの標準FLACファイルのビットレート変動を合わせたグラフです。 静かなPiano部分と音量が大きくなるForte部分に応じてビットレートが変動しているのが観測でしきます。 また、CSVデータから、平均ビットレートを計算しますと、758kbpsで、フレーム当りのサンプル数(spf)は1152でフレーム時間は、26msでした。
上のグラフは、圧縮レベルが、「無圧縮」「標準」「高圧縮」におけるビットレート変動を示します。 このグラフから「高圧縮」が最もビットレート変動が低くファイルサイズが低くなることが分かります。 また、目視でビットレート種別を確認すると、「無圧縮」はCBR(固定ビットレート)で「標準」「高圧縮」はVBR(変動ビットレート)モードを判定できます。 注目すべきは「無圧縮」で、このグラフからビットレート変動が略フラットでCBRと判断出来ますが、MediaInfoで調べたビットレートモードがVBRで結果が相違した点です。
ALACファイル
CSVデータから計算したファイル諸元
項目 | WAV | 無圧縮FLAC | 標準FLAC | 高圧縮FLAC | ALAC |
ビットレート種別 | CBR | CBR | VBR | VBR | VBR |
平均ビットレート | 1,411Kbps | 1,415Kbps | 758Kbps | 697Kbps | 722Kbps |
File size 計算 | 37.7MB | 20.2MB | 18.6MB | 19.2MB | |
SPF | ーー | 1152 | 1152 | 4096 | 4096 |
File size(MB)の計算:ビットレート[kbps] × (1/8)[byte/bit]×サウンドの長さ[秒]×(1/1000) |
ALACの圧縮レベルは、上表の平均ビットレートとSPF(フレーム当たりのサンプル数)値から、標準FLACと高圧縮FLACの間に位置していると思われます。
また、MediaInfoのファイル諸元と比較して、ビットレートや計算上のFile sizeは一致していますが、無圧縮FLACのビットレート種別が異なりました。
ビットレート変動パターンの相関を確認
目視ではFLACとALACのビットレート変動パターンは略近似していることが分かります。
ここでは、フレーム当りのサンプル数(spf:4096)が同一のALACと高圧縮FLACに対して相関係数を確認してみました。
Excel関数のCORRELで相関係数を見ると0.96069となり、「強い正の相関」であることが確認できました。 下に相関図を示します。
可逆性を確認してみました。
念の為、圧縮レベルを変えたFLACファイルとALACファイルをWAVファイルにデコードしハッシュ値(下の記事参照)で確認したところ、全ての組み合わせで元のWAVファイルのハッシュ値と一致し可逆性が確認できました。
-
参 照FLACとALACが元のWAVファイルに復元されるか?ハッシュ値で調べてみました。
過去の記事では、FLACやALACフォーマットをAudacity上で元のWAVファイルとの絶対誤差から復元(可逆性)を確認しました。 FLACやALACの可逆性を確認する方法の一つに「ファイルのハッシ ...
♬ 最後に、標準FLACとALACを聴いてみてください。
直接ブラウザから聴けるプレーヤを配置しています。 必要なら音源ファイルをダウンロードして比較試聴できます。
注意:ALACの場合、ブラウザ又はOSによってはプレーヤの再生ボタン[▶] が効かない場合がありますのでご注意ください。 再生出来ない場合は、ALAC音源ファイルをダウンロードしてVLC media playerで再生できます。
----
macOS:Safari-OK Chrome-NG Firefox-NG Windows:Edge-NG
iPhone:Safari-OK Chrome-OK Firefox-OK Android:Chrome-NG
ネットで調べるとFLACで直接再生したサウンドは、元のWAVのサウンドと相違し、FLACは音が丸み輪郭がボヤける感じになるとのコメントが散見されます。 確かに前記のグラフで見られるビットレートの変動から再生時にはデコード処理をリアルタイムで行わなければなりませんので、CPUなどが非力ですと処理が追いつかずWAV音質との差異が生じる様な気もします。
実際に我が家のB級オーディオのHAP-Z1ESに夫々のファイルを取込み試聴比較したところ、元のWAVファイルとの音質差は全く感じられませんでした。(^_^;)
全体のマトメ
ALACとFLACのアルゴリズムは異なるはずですが、今回ビットレートの変動を確認したところ、フレーム当たりのサンプル数(SPF)に違いがあるものの、ビットレートパターンやビットレートの相関係数からFLACフォーマットとALACフォーマットは近似しており、デコード後(WAV)のハッシュ値でも差異がなく、どちらを使っても音質的に違いはないと思われました。 ただし、Apple製品の場合は、SPFの点を含めALACに最適化されているはずなので、ALACを使う方がベターであるように思われます。