この記事でわかること

  • signalstats フィルタで取得できる統計情報の種類
  • フレームごとの映像信号を数値で出力する方法
  • CSV形式でデータを書き出してグラフ化する方法
  • 放送品質チェックへの活用
  • drawtext との組み合わせで統計をオーバーレイ表示する方法

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


signalstatsとは

signalstats はFFmpegに内蔵された映像分析フィルタです。各フレームの輝度(Y)・色差(Cb/Cr)の統計値をフレームメタデータとして出力します。

主な用途:

  • 放送コンテンツのQC(品質チェック)
  • クリッピング(輝度が0または255を超えている部分)の検出
  • 映像全体のノイズレベル分析
  • フレームごとの明度変化の追跡

取得できる統計情報

統計名説明
YMIN輝度の最小値(0〜255)
YMAX輝度の最大値(0〜255)
YAVG輝度の平均値
YRMS輝度のRMS(二乗平均平方根)
UMIN/UMAX/UAVGCb(青色差)成分
VMIN/VMAX/VAVGCr(赤色差)成分
SATMIN/SATMAX/SATAVG彩度
HUEMED/HUEAVG色相の中央値・平均値
TOUTクリップしたピクセル(輝度が最大または最小)の割合
VREP垂直ライン反復(VHS等のアーティファクト検出)
BRNG放送範囲外(0〜255の合法範囲外)のピクセル割合

基本的な使い方

統計情報を標準エラーに出力する:

ffmpeg -i input.mp4 -vf signalstats -f null /dev/null

出力例(標準エラー):

[Parsed_signalstats_0 @ ...] n:0 YMIN:16 YMAX:235 YAVG:118.2 YRMS:119.5 ...

フレームメタデータとして取得する

signalstats の出力をメタデータとして保存し、ffprobe で読み出す方法:

ffmpeg -i input.mp4 -vf signalstats=stat=tout+vrep+brng,metadata=mode=print:file=stats.txt -f null /dev/null

stats.txt にフレームごとの統計情報が書き出されます。


CSV形式で出力してグラフ化

ffprobe -f lavfi -i "movie=input.mp4,signalstats" \
  -show_frames -select_streams v \
  -print_format csv \
  -show_entries frame_tags=lavfi.signalstats.YAVG,lavfi.signalstats.YMIN,lavfi.signalstats.YMAX \
  > signalstats_output.csv

出力されたCSVをExcelやPythonでグラフ化できます。


輝度平均をリアルタイムにオーバーレイ表示

signalstatsdrawtext を組み合わせると、各フレームに統計値をオーバーレイして動画に書き込めます:

ffmpeg -i input.mp4 \
  -vf "signalstats,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf:text='YAVG\: %{metadata\:lavfi.signalstats.YAVG}':x=10:y=10:fontsize=20:fontcolor=white" \
  output_stats.mp4

特定の統計のみ有効化する(stat オプション)

ffmpeg -i input.mp4 \
  -vf "signalstats=stat=tout+vrep+brng" \
  -f null /dev/null
stat有効になる統計
toutTOUT(クリップピクセル割合)
vrepVREP(垂直ライン反復)
brngBRNG(放送範囲外ピクセル)

複数指定する場合は + で連結します。


放送品質チェックの実用例

放送コンテンツでよく使われる「輝度が16未満または235超のフレーム」を検出:

ffprobe -f lavfi \
  -i "movie=input.mp4,signalstats" \
  -show_frames -select_streams v \
  -print_format flat \
  -show_entries frame_tags=lavfi.signalstats.YMIN,lavfi.signalstats.YMAX \
  2>/dev/null | grep -E "(YMIN|YMAX)"

YAVG推移をテキストファイルに保存する

フレームごとの輝度平均をシンプルなテキストで記録:

ffmpeg -i input.mp4 \
  -vf "signalstats,metadata=mode=print:key=lavfi.signalstats.YAVG:file=yavg.txt" \
  -f null /dev/null

よくある使い方まとめ

目的コマンド
全統計を標準エラー出力-vf signalstats -f null /dev/null
TOUT/BRNG のみ-vf signalstats=stat=tout+brng -f null /dev/null
フレームにオーバーレイsignalstats,drawtext=text='%{metadata\:...}'
CSVで保存ffprobe -f lavfi -i "movie=input.mp4,signalstats" ...

関連記事


一次ソース: ffmpeg.org/ffmpeg-filters.html#signalstats / trac.ffmpeg.org/wiki/FfprobeShowStreamsWithEnhancedOutput