为什么 ffmpeg 生成的 psnr 和 ssim 值与 H264 生成的值不同

Cey*_*kar 2 metrics ffmpeg video-streaming ssim

我从输入流(mxf 或 mov)中获取生成的 mp4 视频流,并且在执行此操作时我将其-psnr用作 H264 参数。结果是大约。40 或 41。

然后我将输入和输出与 psnr(或 ssim)过滤器进行比较。结果大约 20 或 21。这是一个很大的区别。有没有人知道这种差异的原因?

注意:ssim 结果是相似的。第一个是 ~0.97,第二个是 ~0.83

信噪比

ffmpeg -i input.mov -codec:v libx264 -psnr -f mp4 output.mp4
PSNR (~40)

ffmpeg -i output.mp4 -i input.mov -filter_complex psnr -f mp4 /dev/null
PSNR (~20)
Run Code Online (Sandbox Code Playgroud)

SSIM

ffmpeg -i input.mov -codec:v libx264 -ssim -f mp4 output.mp4
SSIM (~0.98...)

ffmpeg -i output.mp4 -i input.mov -filter_complex ssim -f mp4 /dev/null
PSNR (~0.83...)
Run Code Online (Sandbox Code Playgroud)

Ron*_*tje 6

可能是因为两个视频的时间戳没有正确排列。您应该能够通过提供您正在运行的命令的完整输出,然后查看两个输入流的时基来确认这一点。

[编辑] 经过一些播放后,这里有一种方法可以让它忽略时间戳并仅进行 1:1 帧比较:

ffmpeg -i file1 -i file2 \
    -lavfi '[0:v]setpts=N[out0];[1:v]setpts=N[out1];[out0][out1]psnr' \
    -f null -v info -
Run Code Online (Sandbox Code Playgroud)

它可能会抱怨无效的时间戳,但您可以放心地忽略这些错误消息。