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 が本当に大きいかを確かめてください。
音声品質チェックの手順まとめ
astatsで RMS・Peak・DC offset・クリッピングを確認する- クリッピングがあれば、録音レベルや音量を上げた処理を見直す(記録済みの音割れは、音量を下げても直らない)
- DC offset が大きければ、
highpassフィルタで取り除く - RMS レベルがばらついていれば、
loudnormフィルタで音量をそろえる(正規化)
関連記事
- 音量の検出と調整(volumedetect/volume)
- 音量の正規化(loudnorm/LUFS)
- FFprobe で動画・音声のメタデータを取得する
よくある質問
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 のように調べるトラックを指定してください。