広告 MP3、AAC音質関連 オーディオ一般 トピック記事

ffprobeで音声ファイルを解析|【改善版】フレーム単位のビットレート変動のCSV化とグラフ化

【改善版】Opusファイルのビットレート変動

前回の記事ではFFmpegの’ashowinfo’フィルターで音声ファイルのビットレートをCSV化しましたが、WAVやOpus等の一部の音声ファイルで正しくCSV化できず、期待通りに可視化(グラフ化)できないないケースがありました。

この点を改善するため、FFmpegコンポーネントの一部である’ffprobe’に変更することで、WAVおよびOpusファイルにおいても正確にフレーム単位のビットレートをCSV形式に変換できることが分かりました。 

そこで今回は、’ffprobe’に変更した内容を【改善版】として解説するとともに、低ビットレートでも高音質とされるOpusファイル と同じく低ビットレートに適用されるHE-AACファイルに焦点を当てて、フレーム単位の変動グラフの比較 もあわせて紹介します。

 

【改善版】でグラフ化した各種音声ファイルのビットレート変動グラフ

後述の「ドヴォルザークのスラヴ舞曲第1番」CD音源を元に、各種フォーマットに変換した音声ファイルを、今回のffprobeを用いた【改善版】でCSV化したビットレート変動データを、Pythonで作成したアプリでグラフ化しています。

WAV オリジナル音源(CBR)

AAC(VBR)

Opus(VBR)

MP3(VBR)

FLAC(frac-05)

 

オペレータ
オペレータ
ここから、ffprobeを用いた【改善版】の説明になります。

 

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 bash
ffprobe 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化する

  1. 下の「CSV化・bashコード」をテキストエディットアプリ等を開いてコピー&ペーストした後、”Sound file”を対象の音声ファイル名をフルパスで書き換えます。 同じく、”output.csv” を保存先のフルパスに書き換えてコードを編集しておきます。
  2. macOSのターミナル(bash)を開き、編集した「CSV化・bashコード」をコピー&ペーストします。
  3. bashコードを実行すると、音声ファイルのビットレート変動を記録した output.csv が、保存先に CSVファイルとして出力されます。

CSV化・bashコード

コードの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ファイルのビットレート変動を比較する

OpusとHE-AACファイルの作成

オリジナル音源として1959年録音のカラヤンとベルリン・フィルが演奏した「ドヴォルザークのスラヴ舞曲第1番ハ長調 Op.46-1」 CD音源(=リッピングしたFlac 16bit 44.1khzファイル)をWAVに変換した音源ファイルを使います。

WAV(16bit 44.1khz)ファイル:
カラヤン指揮・ドボルザークのスラブ舞曲(Op46-1)

音源 Down Load

macOSのXLDアプリを使い、オリジナルWAVファイルから VBR 64kbps 設定でOpusとHE-AACファイルに変換しました。

Opusオプション設定

  • モード:VBR(可変ビットレート)
  • ビットレート:64Kbps
  • フレームサイズ:20ms(標準)

Opus ♬

HE-AACオプション設定

  • モード:VBR(可変ビットレート)
  • ビットレート:64Kbps
  • 「HE-AACでエンコードする」を選択

HE-AAC ♬

 

オペレータ
オペレータ
では、オリジナルWAVファイルからOpusとHE-AACに変換したファイルを【改善版】CSVでフレーム単位でビットレート変動のグラフを描画してみますね。 オリジナル音源の再生波形も合わせて表示しています。

 

Opusビットレート変動

フレーム当りのサンプル数(spf):882spf
フレーム時間:20ms

HE-AACビットレート変動

フレーム当りのサンプル数(spf):2048spf
フレーム時間:46.44ms

 

OpusとHE-AACのビットレート変動の違い(マトメ)

  1. Opusは、弱音(ピアニッシモ)で、ビットレートが増加し、強音(フォルテ)で低下する傾向が見られる。
  2. HE-AACは、FLACや通常のAAC-LCファイルと同様に、弱音(ピアニッシモ)で、ビットレートが低下し、強音(フォルテ)で増加する傾向が見られる。

以上のことから、Opusコーデックは、HE-AAC含めて他の音声ファイルのビットレート変動とは逆の特性を持ち、音声レベルが高いほど、一定品質を維持するためにビットレートを低下させる(安定させる)方向に調整されると考えられます。

 

合わせて読む

 

以上、ffprobeを使って音声ファイルをフレーム単位で解析し、CSV化してビットレート変動をグラフ化するまでの説明でした。 特筆すべきは、Opusファイルの音声レベルとビットレート変動の関係が、他の音声ファイルとは逆の特性を示したことです。

 

スポンサーリンク