2つ入力した映像を比較し PNSR(Peak Signal to Noise Ratio:2つの映像、または画像の同位置のピクセルの輝度を比較する指標)。MSE(mean squared error)は PSNR を計算するのに使われる。比較する動画は同じ解像度とfps、ピクセルフォーマットである必要がある。

ファイルの入力順が逆だったのを訂正した。2021年8月11日
1入力がオリジナルの動画、2入力がSSIMを計算する動画ではなく、1入力がSSIMを計算する動画で、2入力がオリジナルの動画でlibvmafフィルタと同じ順番。

視覚評価に重きを置いたxpsnrも公開された。2024年9月9日

海外カンファレンスで得た知見を最大化する 〜 NAB Show 2018 編 〜 : developers.cyberagent.co.jp

基本コマンド

最終結果だけを表示。1入力がPSNRを計算する動画で、2入力がオリジナルの動画。
ffmpeg -i input1 -i input2 -filter_complex psnr -an -f null -

1入力と2入力の解像度が異なるときはscale2refフィルタで解像度指定しなくても揃えられる。
ffmpeg -i input1 -i input2 -filter_complex scale2ref,psnr -an -f null -

ログファイルを出力する。
ffmpeg -i input1 -i input2 -filter_complex psnr=f=psnr.txt -an -f null -

コンテナフォーマットが異なる、例えばMP4とMKVなどを比較する。
ffmpeg -i input1.mp4 -i input2.mkv -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref,psnr" -an -f null -

metadataフィルタでフレーム単位でコンソールに表示する方法。ここではunsharpフィルタの psnr_avg を表示している。
ffplay -i input -vf split[a][b];[a]unsharp[A];[A][b]psnr,metadata=print:key=lavfi.psnr.psnr_avg

映像に焼き付けて再生する。
ffplay -f lavfi -i movie=input1.mp4[a];movie=input2.mp4[b];[a][b]psnr,drawtext=fontfile="C\\://Windows/Fonts/arial.ttf":fontsize=20:fontcolor=white:box=1:boxcolor=black@0.4:text='"PSNR="%{metadata\:lavfi.psnr.psnr_avg}'

framesync の設定にも対応している。
2ファイル入力するフィルタの挙動設定 framesync

動画の短い時間の方で終了するにはeof_action=1:shortest=1:repeatlast=0を追加する。
ffmpeg -i input1.mp4 -i input2.mkv -filter_complex "[0:v]settb=1/AVTB,setpts=PTS-STARTPTS[0v];[1:v]settb=1/AVTB,setpts=PTS-STARTPTS[1v];[0v][1v]scale2ref,psnr=eof_action=1:shortest=1:repeatlast=0" -an -f null -

ffmpeg 5.1以降はts_sync_mode対応したのでsettb=1/AVTB,setpts=PTS-STARTPTSが不要になった。
ffmpeg -i 調べたい動画 -i 元の動画 -filter_complex "scale2ref=flags=bicubic,psnr=eof_action=1:shortest=1:repeatlast=0:ts_sync_mode=1" -an -f null -

公式ドキュメント:FFmpeg Filters Documentation : psnr

オプション

  • stats_file, f[string]
    ログファイルの出力名。小数点以下は2桁まで書き込む。で標準出力する
  • stats_version[int]
    ログファイルのバージョン指定
    既定値:1、ログファイル1行目の項目を表示しない
    範囲:1, 2
  • stats_add_max[boolean]
    最大値をログファイルに出力するかの指定。出力する場合はstats_version=2を指定する
    既定値:0

ログファイルの見方

  • psnr_log_version
    stats_versionのバージョン
  • n
    フレーム番号
  • mse_avg
    すべてのチャンネルの不偏分散平均
  • mse_y, mse_u, mse_v, mse_r, mse_g, mse_b, mse_a
    個別のチャンネルの不偏分散平均
  • psnr_y, psnr_u, psnr_v, psnr_r, psnr_g, psnr_b, psnr_a
    個別のチャンネルの psnr
  • max_avg, max_y, max_u, max_v
    YUVチャンネルの最大許容値の平均、個別のチャンネルの最大許容値

扱えるメタデータ。

lavfi.psnr.mse.Y
lavfi.psnr.mse.U
lavfi.psnr.mse.V
lavfi.psnr.mse.R
lavfi.psnr.mse.G
lavfi.psnr.mse.B
lavfi.psnr.mse.A
lavfi.psnr.psnr.Y
lavfi.psnr.psnr.U
lavfi.psnr.psnr.V
lavfi.psnr.psnr.R
lavfi.psnr.psnr.G
lavfi.psnr.psnr.B
lavfi.psnr.psnr.A
lavfi.psnr.mse_avg
lavfi.psnr.psnr_avg

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)