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

问题描述

我是 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 -

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...