この記事でわかること

  • astats フィルタで音声の統計情報を測定する方法
  • RMS・Peak・DC offset・ダイナミックレンジの見方
  • チャンネル別の統計情報の取得
  • volumedetect との使い分け
  • 統計情報を活用した音声品質チェックの方法

テスト済みバージョン: FFmpeg 6.1で確認済み
対象 OS: Windows / macOS / Linux


astats フィルタとは

astats は音声ストリームのさまざまな統計情報をコンソールに出力するフィルタです。RMS(実効値)、Peakレベル、DC offset、ダイナミックレンジ、クリッピングなどを一度に測定できます。


基本的な使い方

音声統計を表示する(動画ファイル)

ffmpeg -i input.mp4 -af "astats" -f null /dev/null

出力はコンソールの stderr に表示されます。

音声ファイルの統計

ffmpeg -i input.mp3 -af "astats" -f null /dev/null

出力の読み方

実行すると以下のような情報が出力されます:

[Parsed_astats_0 @ ...] Channel: 1
[Parsed_astats_0 @ ...]   DC offset: 0.000002
[Parsed_astats_0 @ ...]   Min level: -0.999969
[Parsed_astats_0 @ ...]   Max level: 0.999939
[Parsed_astats_0 @ ...]   Peak level dB: -0.000263
[Parsed_astats_0 @ ...]   RMS level dB: -17.834118
[Parsed_astats_0 @ ...]   RMS peak dB: -12.456
[Parsed_astats_0 @ ...]   RMS trough dB: -40.123
[Parsed_astats_0 @ ...]   Crest factor: 32.789
[Parsed_astats_0 @ ...]   Flat factor: 0.000000
[Parsed_astats_0 @ ...]   Peak count: 0
[Parsed_astats_0 @ ...]   Noise floor dB: -90.234
[Parsed_astats_0 @ ...]   Dynamic range: 72.400
...
[Parsed_astats_0 @ ...] Overall
項目説明
DC offsetDCオフセット(0に近いほど良い)
Peak level dB最大瞬間ピークレベル(dBFS)
RMS level dB全体の平均RMSレベル(dBFS)
RMS peak dB最大RMSレベル
RMS trough dB最小RMSレベル
Crest factorクレストファクター(ピーク/RMS比)
Flat factor連続した同値サンプルの割合(クリッピング検出に利用)
Peak countクリッピングサンプル数
Dynamic rangeダイナミックレンジ(dB)

測定項目のフィルタリング

measure_perchannelmeasure_overall で出力する項目を選択できます。

RMS とピークレベルのみ表示

ffmpeg -i input.mp4 -af "astats=measure_perchannel=RMS_level+Peak_level" -f null /dev/null

全体統計のみ(チャンネル別は省略)

ffmpeg -i input.mp4 -af "astats=measure_perchannel=0" -f null /dev/null

メタデータとして取得する

metadata=1 オプションでフレームごとの統計をメタデータとして生成し、ametadata フィルタで出力することもできます:

ffmpeg -i input.mp4 -af "astats=metadata=1,ametadata=print:file=-" -f null /dev/null 2>&1 | head -50

短い区間ごとの統計(reset パラメータ)

reset パラメータを使うと、指定サンプル数ごとに統計をリセット・出力します:

ffmpeg -i input.mp4 -af "astats=reset=44100" -f null /dev/null

44100サンプル(44.1kHz では約1秒)ごとに統計をリセットします。時系列での音量変化を確認したい場合に有効です。


volumedetect との比較

フィルタ主な用途出力情報
astats詳細な音声品質診断RMS、Peak、DC offset、ダイナミックレンジなど多数
volumedetect簡易的な音量確認mean_volume、max_volume、ヒストグラム

volumedetect はシンプルで素早く音量を確認したい場合に、astats は詳細な品質チェックに適しています:

ffmpeg -i input.mp4 -af "volumedetect" -f null /dev/null

クリッピングの検出

Peak count が 0 より大きい、または Flat factor が高い場合はクリッピングが発生している可能性があります:

ffmpeg -i input.mp4 -af "astats=measure_perchannel=Peak_count+Flat_factor" -f null /dev/null

クリッピングが検出された場合は、volume フィルタで音量を下げるか、ソースのゲインを確認してください。


DC オフセットの確認と修正

DC offsetが大きい場合は highpass フィルタで除去できます:

ffmpeg -i input.mp4 -af "highpass=f=10" output.mp4

まず astats でDC offsetを確認してから適用することが推奨されます。


音声品質チェックの手順まとめ

  1. astats でRMS・Peak・DC offset・クリッピングを確認する
  2. クリッピングがある場合 → volume フィルタで音量を下げる
  3. DC offsetが大きい場合 → highpass フィルタで除去する
  4. RMSレベルが不均一な場合 → loudnorm フィルタで正規化する

関連リソース

よく使うオプション・フィルタ・コーデック設定をまとめた PDF チートシートです。手元に置いておくと調べる時間を短縮できます。

FFmpeg チートシート

関連記事


動作確認: ffmpeg 6.1 / Ubuntu 24.04 (GitHub Actions runner)
一次ソース: ffmpeg.org/ffmpeg-filters.html#astats


よくある質問

astats と ebur128 の違いは?

astats はピーク・RMS・DC・クレストファクタをフレーム単位で出力する波形診断系。ebur128 は放送基準のラウドネス(LUFS)測定。配信ターゲット値の確認には ebur128、波形そのものを見るなら astats。

ピークレベルだけ取り出すには?

メタデータから絞ります: ffprobe -f lavfi -i "amovie=in.wav,astats=metadata=1:reset=0" -show_entries frame_tags=lavfi.astats.Overall.Peak_level -of csv=p=0

astats で無音は検出できる?

間接的には可能です — RMS が閾値(例: -60 dB)以下なら無音区間。ただし正規の無音検出には silencedetect フィルターを使う方が確実です。

チャンネルごとに値が違うのはなぜ?

astats は各チャンネルを独立解析するため。左にしか音が無いステレオファイルは右が -inf dB として出ます。集約値が欲しければ metadata=mode=single を追加してください。

動画ファイルにも astats を使える?

はい。FFmpeg が音声ストリームを自動抽出します。複数音声トラックなら -map 0:a:0 で明示的に選択してください。