
【改善版】Opusファイルのビットレート変動
前回の記事ではFFmpegの’ashowinfo’フィルターで音声ファイルのビットレートをCSV化しましたが、WAVやOpus等の一部の音声ファイルで正しくCSV化できず、期待通りに可視化(グラフ化)できないないケースがありました。
この点を改善するため、FFmpegコンポーネントの一部である’ffprobe’に変更することで、WAVおよびOpusファイルにおいても正確にフレーム単位のビットレートをCSV形式に変換できることが分かりました。
そこで今回は、’ffprobe’に変更した内容を【改善版】として解説するとともに、低ビットレートでも高音質とされるOpusファイル と同じく低ビットレートに適用されるHE-AACファイルに焦点を当てて、フレーム単位の変動グラフの比較 もあわせて紹介します。
【改善版】でグラフ化した各種音声ファイルのビットレート変動グラフ
後述の「ドヴォルザークのスラヴ舞曲第1番」CD音源を元に、各種フォーマットに変換した音声ファイルを、今回のffprobeを用いた【改善版】でCSV化したビットレート変動データを、Pythonで作成したアプリでグラフ化しています。
ffprobeとフレーム情報について
ffprobeはFFmpegのコンポーネントの一部であるため、FFmpegが既にインストールされていれば、ffprobeも利用可能です。
ffprobeの導入
FFmpegがインストールされていない場合は、下の手順を参考にしてください。
ffprobeの導入手順(macOS の場合)
- macOS の場合は、Homebrew を経由する必要があります。 Homebrew の公式サイトより、Homebrew を先ず、インストールしておきます。
- ターミナルを開き、 brew install ffmpeg を実行し、FFmpegをインストールします。
- 念のため、 ffprobe -version を実行し、ffprobeのバージョン情報が表示されれば、ffprobe がインストールされています。
ffprobeは、例えばmacOSならターミナルを開いてffprobeのCLIコマンドを実行することで、画像ファイルや音声ファイルから様々な情報を取得できます。 以下のコマンドを実行すると、基本的な音声ファイル情報が表示されます。
command bash
ffprobe -hide_banner -i "Sound file"
備考:ビットレートモードについて ffprobe 単体で「VBR / CBR / ABR」と明示的に情報を出すことはできません。 ビットレーモードを判別するには、今回説明するビットレート変動グラフから推定を行うことになります。
フレーム情報の基本
AACファイルのフレーム情報を確認するには、以下のffprobe・CLIコマンドを実行します。このコマンドを実行すると、[FRAME]〜[/FRAME]で囲まれた1フレーム分の情報が表示されます。 なお、パイプラインに `head -n 20` を付加することで、最初の20行のみを表示するようにしています。
command bashffprobe imput.m4a -hide_banner -show_frames | head -n 20 -------コマンドを実行すると、以下が表示されます。------ 〜中略〜[FRAME] media_type=audio stream_index=0 key_frame=1 pts=0 pts_time=0.000000 pkt_dts=0 pkt_dts_time=0.000000 best_effort_timestamp=0 best_effort_timestamp_time=0.000000 pkt_duration=1024 pkt_duration_time=0.023220 pkt_pos=972 pkt_size=465 sample_fmt=fltp nb_samples=1024 channels=2 channel_layout=stereo [/FRAME] [FRAME]
上記のフレーム情報(フィールド名=)において、赤文字で示すフィルド名 ’pkt_duration_time’および’pkt_size’が、次節で説明するフレーム単位のビットレートをCSV形式で出力するために必要なフィールド(列)データになります。
pkt_duration_time:パケット持続時間(sec)
pkt_size:パケットサイズ(byte)
【改善版】音声ファイルからフレーム単位のビットレートをCSV化からグラフ化まで
Step
1 音声ファイルをCSV化する
- 下の「CSV化・bashコード」をテキストエディットアプリ等を開いてコピー&ペーストした後、”Sound file”を対象の音声ファイル名をフルパスで書き換えます。 同じく、”output.csv” を保存先のフルパスに書き換えてコードを編集しておきます。
- macOSのターミナル(bash)を開き、編集した「CSV化・bashコード」をコピー&ペーストします。
- bashコードを実行すると、音声ファイルのビットレート変動を記録した output.csv が、保存先に CSVファイルとして出力されます。
CSV化・bashコード
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ffprobe -v quiet -show_frames -select_streams a \ -show_entries frame=pkt_duration_time,pkt_size \ -of csv=p=0 "Sound file" \ | awk -F',' ' BEGIN { OFS=","; elapsed=0 print "pkt_duration_time","pkt_size","elapsed_time","Bit Rate(kbps)" } { # ffprobe の出力、$1:pkt_duration_time $2:pkt_size に対応 duration=$1+0 # +0で数値型に強制 +0 は「数値にキャストする」ためのおまじない。 size=$2+0 if (duration>0) { elapsed+=duration # 経過時間計算 bitrate=(size*8/duration)/1000 #ビットレート計算(kbps) print duration,size,elapsed,bitrate } }' > "output.csv" # フルパスで指定 |
コードのffprobeオプション等要点
- -show_frames:フレームに関する情報を出力
- -select_streams a:音声(audio)ストリームだけを対象にする。(動画なら v 指定)
- -show_entries frame=pkt_duration_time,pkt_size: フレームの情報のうち、出力したいフィールドを限定する。
- -of csv=p=0:出力フォーマットをCSVにp=0 はヘッダ(カラム名)を表示しない設定
- 4行目のawk -F',' :入力をカンマ区切りのフィールドとして、ビットレート計算含めた処理を実行する
CSV化・出力例
フルパスで指定した場所に"output.csv"が保存されています。 下の表がCSVファイルを開いた例になります。
| pkt_duration_time | pkt_size | elapsed_time | Bit Rate(kbps) |
| 0.02322 | 371 | 0.02322 | 127.821 |
| 0.02322 | 372 | 0.04644 | 128.165 |
| 0.02322 | 371 | 0.06966 | 127.821 |
| 0.02322 | 372 | 0.09288 | 128.165 |
| 〜以降 略〜 | |||
3列目のelapsed_timeは、計算された経過時間で、 4列目のBit Rate(kbps)は (2列➗️1列) ✕ 8bit で計算されたビットレートになります。 この3列目と4列目を、例えばnumbersなどの計算ソフトにペーストしてグラフ化(次節で説明)します。
備考:フレーム当りのサンプル数(SPF)は pkt_duration_time ✕ サンプルレート(fs) で計算できます。
例えば、上の「CSV出力例」では、音声ファイルのサンプルレート fs=44.1khzでしたので、SPF = 0.02322 ✕ 44100 = 1,024 になります。
Step
2 CSVからビットレート変動グラフを描画する
CSVからビットレート変動をグラフ化するには、2つの方法があります。
表計算ソフトを使ってグラフ化
今回はmacOSのNumbersを使った例で説明します。(EXCELでも同じ)
グラフ化化 手順
- CSVファイルをダブルクリックすると、Numbersが起動し「Numbers・セル」が表示されます。
- C列とD列の全てを選択します。
- グラフアイコンをクリックして「散布図」を選択します。
- ビットレート変動グラフが表示されるので、グラフのスタイルを編集して完成です。
Numbers・セル
| A | B | C | D |
| pkt_duration_time | pkt_size | elapsed_time | Bit Rate(kbps) |
| 0.02322 | 371 | 0.02322 | 127.821 |
| 0.02322 | 372 | 0.04644 | 128.165 |
| 0.02322 | 371 | 0.06966 | 127.821 |
| 0.02322 | 372 | 0.09288 | 128.165 |
| 〜以降 略〜 | |||
Pythonアプリでグラフ化
下に示す紹介記事で作成したアプリを起動して、CSVファイルを選択するとPythonグラフウィンドウが開きグラフ化されます。 Pythonグラフウィンドウは、グラフ下の7つのインターラクティブボタンがあり、このボタンを操作すれば、拡大・縮小・移動が簡単に行えます。
-
-
紹介記事macOSのショートカットアプリを利用したPythonによるCSVファイルのグラフ化
今まで当ブログでは、macOSのnumbersを使って様々なオーディオ関連のグラフ(例えばスペクトルなど)を添付して来ましたが、Python を使えばグラフ描画機能が充実しており、CSV ...
OpusとHE-AACファイルのビットレート変動を比較する
OpusとHE-AACファイルの作成
オリジナル音源として1959年録音のカラヤンとベルリン・フィルが演奏した「ドヴォルザークのスラヴ舞曲第1番ハ長調 Op.46-1」 CD音源(=リッピングしたFlac 16bit 44.1khzファイル)をWAVに変換した音源ファイルを使います。
macOSのXLDアプリを使い、オリジナルWAVファイルから VBR 64kbps 設定でOpusとHE-AACファイルに変換しました。
Opusオプション設定
- モード:VBR(可変ビットレート)
- ビットレート:64Kbps
- フレームサイズ:20ms(標準)
Opus ♬
HE-AACオプション設定
- モード:VBR(可変ビットレート)
- ビットレート:64Kbps
- 「HE-AACでエンコードする」を選択
HE-AAC ♬
OpusとHE-AACのビットレート変動の違い(マトメ)
- Opusは、弱音(ピアニッシモ)で、ビットレートが増加し、強音(フォルテ)で低下する傾向が見られる。
- HE-AACは、FLACや通常のAAC-LCファイルと同様に、弱音(ピアニッシモ)で、ビットレートが低下し、強音(フォルテ)で増加する傾向が見られる。
以上のことから、Opusコーデックは、HE-AAC含めて他の音声ファイルのビットレート変動とは逆の特性を持ち、音声レベルが高いほど、一定品質を維持するためにビットレートを低下させる(安定させる)方向に調整されると考えられます。
合わせて読む






