astats フィルタとは

astats は、音声を解析して、さまざまな数値をログに表示するフィルタです。平均的な音の大きさ(RMS、実効値)、いちばん大きい瞬間の音量(ピーク)、波形の中心のずれ(DC offset)、ダイナミックレンジ、クリッピング(音割れ)などを一度に調べられます。

基本的な使い方

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

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

結果はターミナルに表示されます(標準エラー出力 stderr)。ファイルは作られません。

音声ファイルの統計

MP3 などの音声ファイルも、同じ書き方で調べられます。

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

出力の読み方

実行すると、次のような行が表示されます。

[Parsed_astats_0 @ ...] Channel: 1
[Parsed_astats_0 @ ...] DC offset: 0.000016
[Parsed_astats_0 @ ...] Min level: -0.339507
[Parsed_astats_0 @ ...] Max level: 0.347663
[Parsed_astats_0 @ ...] Min difference: 0.000000
[Parsed_astats_0 @ ...] Max difference: 0.244717
[Parsed_astats_0 @ ...] Mean difference: 0.031762
[Parsed_astats_0 @ ...] RMS difference: 0.042086
[Parsed_astats_0 @ ...] Peak level dB: -9.176838
[Parsed_astats_0 @ ...] RMS level dB: -23.311905
[Parsed_astats_0 @ ...] RMS peak dB: -19.956980
[Parsed_astats_0 @ ...] RMS through dB: -42.057184
[Parsed_astats_0 @ ...] Crest factor: 5.090417
[Parsed_astats_0 @ ...] Flat factor: 0.000000
[Parsed_astats_0 @ ...] Peak count: 2
[Parsed_astats_0 @ ...] Abs Peak count: 1
[Parsed_astats_0 @ ...] Noise floor dB: -32.266999
[Parsed_astats_0 @ ...] Noise floor count: 422
[Parsed_astats_0 @ ...] Entropy: 0.779411
[Parsed_astats_0 @ ...] Bit depth: 30/32/32/32
[Parsed_astats_0 @ ...] Dynamic range: 136.555299
...
[Parsed_astats_0 @ ...] Overall
...

Channel: 1 から下がチャンネルごとの値、Overall から下が全チャンネルをまとめた値です。Peak level dB や RMS level dB の単位は dBFS です。デジタル音声で出せる最大の音量を 0 とした単位で、ふつうはマイナスの値になり、0 に近いほど大きい音です。

項目 説明
DC offset 波形の中心のずれ(0に近いほど良い)
Peak level dB いちばん大きい瞬間のピークレベル(dBFS)
RMS level dB 全体の平均的な音量(RMS、dBFS)
RMS peak dB RMS の最大値
RMS through dB RMS の最小値(FFmpeg 7.1 までの表示は RMS trough dB)
Crest factor ピークと RMS の比(クレストファクター)
Flat factor ピーク(最大値・最小値)で同じ値のサンプルが続く度合い(クリッピングの検出に使う)
Peak count 信号が最大値(Max level)か最小値(Min level)に達した回数。音割れしていない音でも 0 にはならない
Dynamic range ダイナミックレンジ(dB)

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

表示する項目は、measure_perchannel(チャンネルごと)と measure_overall(全体)で選べます。

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

項目名は + でつなぎます。

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

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

measure_perchannel=0 にすると、チャンネルごとの表示が消えて Overall だけが残ります。

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

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

metadata=1 を付けると、フレームごとに統計値がメタデータ(音声データに付く付加情報)として記録され、ametadata フィルタで表示できます。値は、そのフレームまでの累計です。区間ごとの値にするには reset を使います。

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

出力が長くなるので、例では head で先頭だけを表示しています。

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

reset は、指定したフレーム数ごとに統計をリセットします。数えるのはサンプルではなく音声のフレームで、AAC の音声なら 1 フレームは 1024 サンプルです。ログの最後に出る値は、最後にリセットしてからの区間の分だけなので、区間ごとの値を見るには metadata=1 と ametadata を組み合わせます。

ffmpeg -i input.mp4 -af "asetnsamples=n=44100,astats=metadata=1:reset=1,ametadata=print:key=lavfi.astats.Overall.RMS_level:file=-" -f null /dev/null

この例では、asetnsamples で 1 フレームを 44100 サンプルにまとめ、reset=1 で 1 フレームごとにリセットしています。44.1kHz の音声なら、1 秒ごとの RMS が表示されます。時間とともに音量がどう変わるかを見たいときに使います。

volumedetect との比較

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

音量をざっと確かめるだけなら、volumedetect の方が手軽です。品質を細かく調べるときは astats が向いています。volumedetect は次のように使います。

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

クリッピングの検出

クリッピングは、音が上限を超えて波形の山が平らに削れた状態です。音割れとして聞こえます。Peak level dB が 0 dB(上限)に達しているか超えているときは、クリッピングが起きている可能性があります。WAV などの非圧縮の音声で、削れた山が同じ値の連続になっていれば、Flat factor も 0 より大きくなります。削れたのが山ごとに 1 サンプルだけの軽いクリッピングでは 0 のままなので、0 でも音割れがないとは言えません。Peak count は音割れしていない音でも 0 にならないので、判定には使えません。

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

volumedetect で max_volume: 0.0 dB と出るときも、音が上限に達しています。-0.0 dB は、上限にわずかに届かない音でも表示されます。クリッピングが見つかったら、元の音源のゲイン(録音レベル)や、音量を上げた処理を見直してください。ファイルにすでに記録された音割れは、volume フィルタで音量を下げても元に戻りません。

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

DC offset は、波形全体が 0 の位置から上か下にずれている状態です。値が大きいときは、highpass フィルタで取り除けます。

ffmpeg -i input.mp4 -c:v copy -af "highpass=f=10" output.mp4

使う前に、astats で DC offset が本当に大きいかを確かめてください。

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

  1. astats で RMS・Peak・DC offset・クリッピングを確認する
  2. クリッピングがあれば、録音レベルや音量を上げた処理を見直す(記録済みの音割れは、音量を下げても直らない)
  3. DC offset が大きければ、highpass フィルタで取り除く
  4. RMS レベルがばらついていれば、loudnorm フィルタで音量をそろえる(正規化)

関連記事

よくある質問

astats と ebur128 の違いは?

astats は、ピーク・RMS・DC offset・クレストファクターなどを出す、波形を調べるためのフィルタです。ログにはファイル全体の値が出ます。フレームごとに値を取り出すには metadata=1 を使います(reset を付けないと、その時点までの累計の値になります)。ebur128 は、放送や配信の基準に使うラウドネス(LUFS、人が感じる音の大きさ)を測ります。配信先の目標値に合っているかを確かめるなら ebur128、波形そのものを見るなら astats を使います。

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

metadata=1 で記録したメタデータから、ピークレベルだけを取り出します: 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

値はフレームごとに1行ずつ出ます。reset=0 でリセットしないので、最後の行がファイル全体のピークです。

astats で無音は検出できる?

間接的にはできます。RMS がしきい値(例: -60 dB)以下の区間を無音とみなします。ただし、無音を探すなら silencedetect フィルタの方が確実です。

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

astats は、チャンネルを1つずつ別々に解析するためです。左にしか音がないステレオファイルでは、右が -inf dB と表示されます。全チャンネルをまとめた値は、ログの Overall の欄に最初から表示されています。

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

使えます。FFmpeg が音声トラックを自動で選んで解析します。音声トラックが複数あるときは、-map 0:a:0 のように調べるトラックを指定してください。