ffmpeg:如何将 SSIM 和 PSNR 保存到文件中?

ffmpeg: How to save SSIM and PSNR to a file?

我是一个 ffmpeg 新手。 我希望我的脚本(在 Windows 上)将平均 PSNR 和平均 SSIM 值输出到一个文件。 (但不是每一帧的值) 我可以将它们输出到标准输出,但不能输出到文件。

我用这条线:

ffmpeg -i ref.avi -i compressed.avi -lavfi  "ssim;[0:v][1:v]psnr" -f null -

我知道我必须在此处更改一些内容:“-f null -”,但我无法使其正常工作。

使用 ssim 和 psnr 过滤器

在 Linux 和 macOS 上您可以使用 grep:

$ ffmpeg -i compressed.avi -i reference.avi -lavfi "[0][1]ssim;[0][1]psnr" -f null - |& grep Parsed_ > ff.log

简单,但主要缺点是它不会向您显示控制台输出,因此您可能会错过错误。要解决此问题,请添加 tee:

$ ffmpeg -i compressed.avi -i reference.avi -lavfi "[0][1]ssim;[0][1]psnr" -f null - |& tee >(grep Parsed_ > ff.log)

来自任一命令的 ff.log 的示例内容:

[Parsed_ssim_0 @ 0x5579d7f17b40] SSIM Y:0.796135 (6.906565) U:0.843488 (8.054531) V:0.822424 (7.506157) All:0.820682 (7.463768)
[Parsed_psnr_1 @ 0x5579d7f12b00] PSNR y:24.940925 u:23.938192 v:23.641771 average:24.138969 min:23.298059 max:26.880485
  • 如果您想附加到 ff.log 而不是覆盖,请改用 grep Parsed_ >> ff.log
  • 如果 |& 对您不起作用,请改用 2>&1

或者使用 libvmaf

libvmaf 过滤器较慢,但会输出一个日志文件,其中包含 VMAF、SSIM 和 PSNR 聚合分数以及 XML 或 JSON 中的每帧分数。您的 ffmpeg 需要使用 --enable-libvmaf 进行编译才能使用此过滤器。

ffmpeg -i compressed.avi -i reference.avi -lavfi "[0][1]libvmaf=log_path=vmaf.xml:log_fmt=xml:ssim=1:psnr=1" -f null -