AAC(又MP3 )に変換するエンコーダの種類で、CBRモードで変換した音声ファイルをMediaInfoアプリで確認すると、ビットレート種別がVBR(可変)と判定されたり、逆にVBRモードで変換した音声ファイルをMediaInfoで確認すると、ビットレート種別がCBR(固定)と判定される場合があり、何が正しいか分からない時があります。
(実例はここをクリック)
そこで、AAC(又MP3 )に変換した音声ファイルをFFmpegで1秒単位で連続して切り出し夫々のファイルのビットレート情報をffprobeでCSVファイルに保存した後、CSVファイルをNumbers(又Excel)に取り込みグラフ化(見える化)してビットレートの変化を目視したり、標準偏差などの統計データも求められると考えました。 ただ、この方法は、秒単位のビットレートのため分解能が低いという問題がありますが、大雑把な傾向は確認でき、ビットレート種別の特定には向いているのでは無いかと考えました。
ビットレート・グラフの分解能が必要ならこちらのブログをご覧ください。
今回は、macOSのXLDアプリでCBRとVBRモードでAAC変換した音声ファイルを対象に、ビットレートのCSVからグラフ化までの評価方法を紹介します。 (2024/9/16付け:MP3変換も後段に追記しました。)
備考:ビットレート種別について
- CBR:固定ビットレート(constant bitrate, CBR) 電気通信におけるQuality of Serviceに関連する用語で、コーデックの出力データの消費されるべきレート(速度)が一定です。 このため、容量を無駄に消費する。 ハフマン符号や連長圧縮などの符号の多くは可変長符号を生成するため、完全なCBRを実現することは難しい。
- VBR:可変ビットレート(Variable Bitrate、VBR) 主に音声や動画などの圧縮時にビットレートを可変するという方式の一つ。 ファイルサイズが同容量ならばCBRと比較して高品質となる。
- AVR:平均ビットレート(Average Bitrate) 純粋な可変ビットレートの場合、出力する結果がどれほどのビットレートになるのか予測するのは難しい。そのために、品質をコントロールし、目的のビットレートに近づける方法が平均ビットレートである。厳密にはVBRの一種に含まれ、ABRと略される。
なお、AVRは音質上の面からウエイトは低いと考え、今回の評価対象はCBRとVBRにします。
先ず、VBRモードで変換したAACファイルを今回の方法で作成したビットレート・グラフをご覧ください
下のグラフは、「ドボルザークのスラブ舞曲(Op46)」をmacOS用のXLDアプリで[目標最高品質値:127]設定のVBRモードで変換したAACファイルを今回説明する方法で秒単位のビットレートをグラフ化(赤の折れ線グラフ)し、更にAudacityによる音声ファイルのWave波形を重ね合わせています。
XLDで変換したAAC(VBR-q127)ファイル:
カラヤン指揮・ドボルザークのスラブ舞曲(Op46-1)
折れ線グラフの説明
- 最高のビットレートは320kbpsを超えています。
- 急峻なレベル変動に応じてビットレートも変動し、特に楽曲の無音の終点部分でビットレートが急減しておりVBRであることが分かります。
- AAC(VBR-q127)ファイルをMediaInfoで念のため確認するとビットレートの種別はVBRと判定されました。 (後から説明しますが、CBRモードで変換したAACファイルは、MediaInfoでは、VBRと判定されてしまいます。)
音声ファイルを1秒単位で切り出し、ビットレート情報をCSVファイルに保存する方法
音声ファイルの切り出しは、FFmpeg CLIを使い、ビットレート情報は、FFmpegに付属するffprobe CLIを使います。 FFmpegのインストールについては、ここの記事を参照してください。
コマンドライン(CLI) 音声ファイルの切り出すFFmpeg CLI ffmpeg -y -i "$input_file" -ss "$start_time" -t "$slice_length" -c copy "$slice_file" 音声ファイルのビットレート情報を調べ出力形式を CSVにするffprobe CLI ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of csv=p=0 "$slice_file"
以上のコマンドラインを使って、音声ファイルを1秒単位でビットレート情報をCSVに出力するbash scriptは以下になります。 (このbash scriptは「ChatGPT」を使用し一部追加・修正を加え作成しました。)
bash scriptの実行について
mi等のテキストエディタを起動して、bash scriptコードをコピペした後、
2行と4行目のxxxはデスクトップパスを記入します。 9行目(input_file)に”AACファイルのフルパス”、及び12行目(output_csv)に”フルパスでcsvのファイル名"を代入して例えば「bitrate」名で保存します。 Finderで「bitrate」の拡張子を .sh に変更(例えば、bitrate.sh)してターミナルから以下のコマンドコードを実行すれば、デスクトップのbitrateフォルダーのBitrate_log.csv にAACファイルのビットレートが秒単位で保存されます。
ーーー
bash "フルパス/bitrate.sh"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# デスクトップにbitrateフォルダーが存在するか確認 if [ ! -d "/Users/xxx/Desktop/bitrate/tmp" ]; then # フォルダーが存在しない場合、作成する mkdir -p "/Users/xxx/Desktop/bitrate/tmp" # -pオプション(「parents」の略で、指定したディレクトリの親ディレクトリも一緒に作成) fi # 入力AACファイルのパス input_file="/path/to/your/input.m4a" # 出力CSVファイルのパス(デスクトップ) output_csv="/Users/xxx/Desktop/bitrate/Bitrate_log.csv" # スライスの長さ(秒) slice_length=1 # ヘッダーをCSVファイルに書き込み echo "Start Time (s),End Time (s),Bitrate (kbps)" > "$output_csv" # 全体の長さを取得 total_duration=$(ffprobe -v error -show_entries format=duration -of csv=p=0 "$input_file") total_duration=${total_duration%.*} echo "Total Duration: $total_duration seconds" # スライスごとにビットレートを取得 for (( start_time=0; start_time<total_duration; start_time+=slice_length )); do end_time=$((start_time + slice_length)) # 切り出すファイルのパス slice_file="/tmp/slice_${start_time}_${end_time}.aac" # 音声ファイルをスライスする ffmpeg -y -i "$input_file" -ss "$start_time" -t "$slice_length" -c copy "$slice_file" > /dev/null 2>&1 # スライスファイルのビットレートを取得 bitrate=$(ffprobe -v error -select_streams a:0 -show_entries stream=bit_rate -of csv=p=0 "$slice_file" 2>/dev/null) # ビットレートが取得できない場合の処理 if [ -z "$bitrate" ]; then bitrate="N/A" else bitrate=$((bitrate / 1000)) # kbpsに変換 fi # CSVファイルに記録 echo "$start_time,$end_time,$bitrate" >> "$output_csv" # スライスファイルを削除 rm "$slice_file" done |
m4a,mp3,wav,aiffの音声ファイルはCSV化できましたが、原因は不明ですが、flacファイルはCSV化出来ませんでした。 ご注意ください。
ビットレート情報が保存されたCSVファイルから、グラフ化する方法
macOSの場合、保存されたCSVファイルをダブルクリックすると、Numbersが起動して、CSVファイルが読み込まれ時間(sec)とビットレート(kbps)データが表に展開されます。
ビットレートのグラフ化と標準偏差を求める操作方法は下の動画を参照してください。
なお、動画に使用したCSVファイルは、VBR-q60で設定したAACファイルです。
グラフ化で使用する対象AACファイルについて
今回のAACエンコーダは、XLDアプリを使用します。 XLDのモード設定は、CBR、VBR、AVRのビットレート・モード(種別)を選ぶことができますが、今回は、XLDアプリで「CBRモード」及び「VBRモード」で設定したAACファイルをグラフ化し、ビットレートの変化を比較します。
ビットレート・モードの設定について
macOS用のXLDアプリは、AAC変換を行う時にXLDの環境設定から出力フォーマット【MPEG-4 AAC】のオプションからビットレート・モードのCBRやVBRを選択できます。
環境設定
オプション
今回、グラフ化で使用するビットレート・モード(種別)の設定は以下の3種類です。
- CBR-320k:CBR 320kbps(最大値)
- VBR-q127:VBR 目標品質127(最大値)
- VBR-q60:VBR 目標品質60
変換元の音源は、1959年録音のカラヤンとベルリン・フィルが演奏した「ドヴォルザークのスラヴ舞曲第1番ハ長調 Op.46-1」CD音源(=リッピングしたFlac 16bit 44.1khzファイル)を使用しました。
AACのCBR及びVBRモードで変換した時のビットレート・グラフ比較
折れ線グラフの説明
- CBR-320kbpsで設定したビットレート(赤ライン):
再生時間の始点から終点まで略320kbpsを維持してフラットな直線で、標準偏差は1.2kbpsでバラツキは少なくCBRモードで変換されていると考えられます。 - VBR-q127のビットレート(青ライン):
楽曲の無音の終点部分でビットレートが急減し途中で変動が見られビットレートの最大値は、361.0kbpsを示す。 時間全幅の標準偏差は44.6kbpsであった。 - VBR-q60のビットレート(緑ライン):
ビットレートの最大値は、158.0kbpsを示す。 途中での変動幅は、VBR-q127より少なく時間全幅の標準偏差は20.4kbpsであった。
統計データ
ビットレート | CBR-320k | VBR-q127 | VBR-q60 |
中央値 | 320.0kbps | 346.0kbps | 143.0kbps |
平均 | 319.5kbps | 339.9kbps | 140.9kbps |
標準偏差 σ | 1.2kbps | 44.6kbps | 20.4kbps |
max | 323.0kbps | 361.0kbps | 158.0kbps |
min | 316.0kbps | 2.0kbps | 2.0kbps |
レンジ(max-min) | 7.0kbps | 359.0kbps | 156.0kbps |
種別・判定 | 準CBR | VBR | VBR |
file size | 8.6MB | 9.1MB | 3.8MB |
ビットレート種別・判定基準(仮決め)
- バラツキが無く標準偏差が「0」であればCBRと判定します。
- 再生時間の始点から終点までビットレートが略フラットでバラツキの標準偏差が10kbps未満であれば「準CBR」と判定します。
- 標準偏差が10kbps以上をVBRと判定します。
MediaInfoで各々のAACファイルの情報を見ると(考察)
AAC(CBR−320)ファイルがMediaInfoではVBRと判定されています。 AAC(CBR−320)ファイルの前出のビットレート・グラフを見ると再生時間全幅で僅かなジッター(標準偏差で1.2kbps)があり、これをVBRと誤認しているかも知れません。 メディア情報を見る別のアプリ「File-Info Lite」で確認すると、 Bit rate mode : Constant と表示されました。
結論として、
XLDでCBR-320k設定したAACファイルの場合、MediaInfoのビットレート種別はVBRで示されましたが、前述の判定基準から準CBRと思われます。
MP3のCBRとVBRモードで変換した時のビットレート・グラフ化
(2024/9/16追記)
今度は、XLDによるMP3のビットレート・モード(種別)を変えた時のMP3ファイルをビットレートのグラフ化を行った結果を追記しました。
point
1 XLD MP3のモード設定
MP3変換を行う時にXLDの環境設定から出力フォーマット【LAME MP3】のオプションからビットレート・モードのCBRやVBRを選択できます。 CBR及びVBRの設定は、最高品質で設定しています。
point
2 XLD MP3のCBRとVBRモードのビットレート・グラフと統計データ
折れ線グラフの説明
- CBR-q2-320kbpsで設定したビットレート(赤ライン):
再生時間の始点から終点まで320kbpsを維持してフラットな直線で、CBR設定で見られたジッター無く標準偏差のバラツキは0kbpsでCBRモードで変換されていると考えられます。 - VBR-q2-260kのビットレート(青ライン):
楽曲の無音の終点部分でビットレートが急減し途中で変動が見られVBRで変換されている。 最大ビットレートは、282.0kbpsでCBRのビットレート320.0kbpsに届いていないので、品質的にCBR-q2-320kbpsより劣ると思われます。
統計データ | CBR-q2-320k | VBR-q2-260k |
中央値 | 320.0kbps | 254.0kbps |
平均 | 320.0kbps | 252.1kbps |
標準偏差 σ | 0.0kbps | 30.8kbps |
max | 320.0kbps | 282.0kbps |
min | 320.0kbps | 32.0kbps |
レンジ(max-min) | 0.0kbps | 250.0kbps |
種別・判定 | CBR | VBR |
file size | 8.5MB | 6.6MB |
point
3 MediaInfoとの比較
Mediainfo情報の抜粋の様に、MP3でCBR設定を選んで変換したMP3ファイルは、ビットレート種別でCBRで表示され、VBRで設定した場合も同じ様にVBRで正しく表示されました。
このMediaInfo結果は、MP3ファイルからCSV化して算出した統計データのビットレート種別・判定と差異無く一致しました。
point
4 MP3のCBRとVBRモード(マトメ)
- CBR-q2-320k設定の場合:
AACと違いビットレートは、再生時間全幅で僅かなジッター(標準偏差で1.2kbps)が見られれたが、MP3のCBR設定では、ジッター無く完全フラットな直線で描画された。 - VBR-q2-260k設定の場合:
最大ビットレートで282.0kbpsで、CBRのビットレート320kbpsに届いていない。 グラフのパターンから見ると、AACのVBR最大品質(127)より劣りVBR-q100相当の品質レベルと思われる。
以上、音声ファイルのビットレート・グラフ化とCBRかVBRかを特定する迄の紹介でした。 今後、他の非可逆圧縮エンコーダについても確認してみたいと思います。
参考:XLDアプリ・VBRモードで変換したAACファイルのパフォーマンスは如何に?
XLDアプリのCBR-320kでAAC変換した時、ビットレートは最大323.0kbps、中央値320.0kbpsでファイルサイズは8.6MBでした。 VBR-q127とVBR-q60のビットレート中央値の近似直線から、CBR-320kの中央値と同等になるVBRモード品質目標値を求めると118でした。
このVBR品質目標値を118(=q118)にして、AAC変換したところ、最大ビットレートはCBR-320kと略同じ322.0kbpsでファイルサイズは8.1MBになりCBR-320kより低いも僅差でした。 ビットレート・グラフは以下の通りです。
以上の結果から、
XLDのAACエンコーダに限れば、VBRとCBRのパフォーマンスは殆ど変わらないので、パラメータ設定が分かり難いVBRモードを選ぶより多少ファイル容量が増えたとしても品質的に安定なCBRモードを選択する方が無難では無いかと思われました。