
Opusファイルのビットレート変動
※ 本記事は2026年2月に改訂しました。
音声ファイルのビットレート変動を可視化する際、FFmpeg の ashowinfo フィルターでは、WAV や Opus など一部の形式で正しく数値を取得できず、期待通りにビットレート変動をCSV化できないケースがありました。(前回の記事)
本記事では、FFmpeg コンポーネントの一つである ffprobe を用いることで、WAV や Opus ファイルにおいても フレーム(サンプル)単位のビットレート情報を正確に取得し、CSVファイル を生成する方法を解説します。
さらに、macOSの「ショートカット」アプリを使い、音声ファイルを選択するところから、ビットレート変動を記録したCSVファイルの作成、そのCSVをもとにしたビットレート変動の可視化までを、以下の目的別にオールインワンツールとして、自動化処理を行う方法を紹介します。
- 統計処理やグラフ化を行う :
CSVファイルが引き継がれたNumbersが自動起動する - 直ぐにビットレート変動グラフを確認 :
Pythonによるビットレート変動グラフを自動描画する
【ffprobe】でグラフ化した各種音声ファイルのビットレート変動グラフ
後述の「ドヴォルザークのスラヴ舞曲第1番」CD音源を元に、各種フォーマットに変換した音声ファイルを、今回のffprobeを用いた【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)
基本|音声ファイルから【ffprobe】でフレーム単位のビットレートを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 になります。
スポンサーリンク
ビットレート変動を可視化するオールインワンツールを作成する手順
ツール・概要
macOSショートカットを活用し、音声ファイルをffprobeにてCSV形式に変換後、下記に示す目的別に一連の自動化処理を実行します。
- ビットレート変動の統計処理やグラフ化を行う :
CSVファイルが引き継がれたNumbersが自動起動する - 直ぐにビットレート変動グラフを確認 :
Pythonによるビットレート変動グラフを自動描画する
まず、完成したショートカットの動作ビデオを下に示しますので、ご覧ください。
ツールの実行ビデオ
メニューで「直ぐにビットレート変動を確認」を選択した時のビデオです。
アクションの配置と説明
macOSショートカット・アプリを起動して「ファイル」>「新規ショートカット」をクリックすると、まっさらなショートカット編集画面が現れます。 ここに必要なアクションを配置して行きます。 今回のショートカット名は【音声ファイル:ビットレート解析】にしました。
配置したアクションは①〜⑧ です。 アクション①〜⑧ は後から詳しくAct1〜Act8で説明していきます。


Act
1 アラート
このアクションで、設定されたタイトルなどのアラート・ダイアログが表示されます。

Act
2 ファイルを選択
このアクションで、Finderが開きビットレート変動をCSV化したい一つの音声ファイルを選択します。 選択されたファイルはファイルパスなどがマジック変数としてこのアクションから出力されます。
Key Points
Macショートカットが対話型UIのため、説明中にあるマジック変数の扱いに最初の内は、多少の戸惑いを伴います。 このマジック変数とは何なのか?、詳しくは下の「参考記事」をご覧ください。
-
-
参考記事macOSショートカットアプリ:これで分かったマジック変数の取扱い
Appleショートカットアプリは簡単にプログラムが組めますが、独特の対話型UIのため特に(シェルスクリプトから実行)アクションに引き継ぐマジック変数の扱いが良く理解出来ませんでした。 今回、ファイル操 ...
Act
3 シェルスクリプトを実行
このアクションは、前述した「CSV化・bashコード」を起動する様にします。 シェルはbash又はzsh Scriptを選択します。
このアクションが実行されると、ffprobeで解析した結果をデスクトップの BitRate_CSV.csv に保存します。
【キー・ポイント】
4行目の input= には、Act 2 で出力されたマジック変数[ファイル (ファイルパス)]を入力します。 このマジック変数のプロパティは、このマジック変数をクリックして、ファイルパスを選択します。
|
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 |
# ------ # ffprobeで音声ファイルのフレーム単位でビットレート情報を取得し、CSVファイルを生成 # ------ input="ファイル (ファイルパス)" #選択音声ファイルをマジック変数をフルパスで受け取る OUT="/Users/〜/Desktop/BitRate_CSV.csv" #CSV保存先を指定 # ffprobe CSV化処理 /opt/homebrew/bin/ffprobe -v quiet -show_frames -select_streams a \ -show_entries frame=pkt_duration_time,pkt_size \ -of csv=p=0 "$input" \ | awk -F',' ' BEGIN { OFS=","; elapsed=0 print "pkt_duration_time","pkt_size","elapsed_time","Bit Rate(kbps)" } { duration=$1+0 size=$2+0 if (duration>0) { elapsed+=duration bitrate=(size*8/duration)/1000 print duration,size,elapsed,bitrate } }' > "$OUT" # CSVファイル出力 |
Act
4 メニューから選択
このアクションは、Numbersを起動させるか? 直ぐにビットレート変動を確認したいか?を選びます。 選ばれた項目に従って処理を分岐します。

1)Numbersで統計処理やグラフ作成を行う:が選択された場合 Act 5 を実行する
Act
5 アプリを開く
このアクションは、デスクトップの BitRate_CSV.csv を指定してNumbers アプリを開きます。 下に示すように、Numbers上で統計計算や散布図によるビットレート変動・グラフも作成することができます。

Act
6 このショートカットを停止
このアクションは、ショートカットを停止します。 このアクションを設けないとNumbersが起動した後ショートカットが起動したままになることを防ぎます。
2)直ぐにビットレート変動を確認する:が選択された場合 Act 7 を実行する
Act
7 ファイル
このアクションは、デスクトップの BitRate_CSV.csv を指定します。 このアクションで指定されたファイルパスなどがマジック変数として出力されます。
Acti
8 シェルスクリプトを実行
このアクションは、以前の記事で作成した「CSVファイルをPythonでグラフ化」のScriptの一部を利用してPythonグラフを起動する様にします。 シェルはPython3 を選択します。
このアクションが実行されると、デスクトップの BitRate_CSV.csv をPythonグラフに表示します。
【キー・ポイント】
- 10行目の csv_path = には、Act 7 で出力されたマジック変数[CSVファイル (ファイルパス)]を入力します。 このマジック変数のプロパティは、このマジック変数をクリックして、ファイルパスを選択します。
- 43行目の file_path = には、Act 2 で出力されたマジック変数[ファイル (ファイルパス)]を入力します。 このマジック変数のプロパティは、このマジック変数をクリックして、ファイルパスを選択します。
|
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 |
# ------ # CSVファイルを取得し、Pythonグラフで描画 # ------ import pandas as pd import matplotlib.pyplot as plt import matplotlib import os # ====== 設定 ====== csv_path = "CSVファイル (ファイルパス)" # CSVのフルパスのマジック変数を受け取り x_col_index = 2 # 3列目(0始まり):経過時間 y_col_index = 3 # 4列目(0始まり):ビットレート # ================== # macOS 日本語フォント設定 matplotlib.rcParams['font.family'] = 'Hiragino Maru Gothic Pro' # CSV読み込み df = pd.read_csv(csv_path) # 列数チェック if x_col_index >= len(df.columns) or y_col_index >= len(df.columns): raise ValueError("指定した列番号がCSVの列数を超えています") # 数値でない行を除外 df = df[ pd.to_numeric(df.iloc[:, x_col_index], errors="coerce").notna() & pd.to_numeric(df.iloc[:, y_col_index], errors="coerce").notna() ] # x, y 抽出 x = df.iloc[:, x_col_index] y = df.iloc[:, y_col_index] # グラフ描画 plt.figure(figsize=(8, 5)) plt.plot(x, y, linewidth=0.8 ,color="navy") #グラフの線幅と線色指定 # ラベルとタイトル x_name = df.columns[x_col_index] y_name = df.columns[y_col_index] file_path="ファイル (ファイルパス)" # 音声ファイルをマジック変数で受け取り basename = os.path.basename(file_path) plt.title(f"{basename} \n 【 ビットレート変動グラフ 】") plt.xlabel(x_name) plt.ylabel(y_name) plt.grid(True) plt.show() |
以上で【音声ファイル:ビットレート解析】ショートカットの完成です。
▶を押すとショートカットが起動します。
![]()




