0

我正在尝试计算原始文件中已处理视频的VMAF分数。

我用过的命令:

ffmpeg -y -loglevel info -stats -i original.mp4 -i processed.mp4 -lavfi "[0]null[refdeint];[refdeint]scale=1920:1080:flags=neighbor[ref];[1]setpts=PTS+0.0/TB[b];[b]scale=1920:1080:flags=neighbor[c];[c][ref]libvmaf=log_fmt=json:phone_model=1:model_path={model_path_here}/vmaf_v0.6.1.json:n_subsample=1:log_path=log.json" -f null -

现在根据vmaf with ffmpegfound here的官方文档,它说source/reference文件后跟encoded/distorted/processed文件。

但是我遇到的几乎所有博客,它们都使用相反的 args 顺序,即processed文件后跟original文件。

几个例子:

  1. https://medium.com/@eyevinntechnology/keep-an-eye-on-the-video-quality-b9bcb58dd5a1:在其中搜索“在 FFMPEG 中使用 VMAF”。

  2. https://websites.fraunhofer.de/video-dev/calculating-vmaf-and-psnr-with-ffmpeg/:在其中搜索“使用 FFmpeg 进行度量计算”。

编辑

注意:更改顺序确实会更改 VMAF 分数。

4

2 回答 2

1

它并不真正关心您如何在命令行中指定源文件。如何将视频流提供给 libvmaf 过滤器很重要。

默认情况下,命令行中第一个指定的源将变为 index=0 的流,第二个指定的源 - 索引=1 的流。

您可以指定如何将这些流提供给 libvmaf 过滤器,但您不必这样做。如果您没有这样做,索引为 0 和 1 的流将按该顺序提供给过滤器。

让我们看看你的例子。

Netflix 手册(我删除了不需要的部分):

ffmpeg ... -i src01_hrc00_576x324.yuv \
       ... -i src01_hrc01_576x324.yuv \
    -lavfi "[0:v]setpts=PTS-STARTPTS[reference]; \
            [1:v]setpts=PTS-STARTPTS[distorted]; \
            [distorted][reference]libvmaf=model_path={your_vmaf_dir}/model/vmaf_v0.6.1.json" \
    -f null -

请注意,索引=0 的视频流(命令行中第一个指定的流)被重命名为引用[0:v]...[reference]),索引=1(命令行中的第二个)的视频流重命名为扭曲的([1:v]...[distorted])。

但是当他们按顺序发送到 libvmaf 时:扭曲然后引用([distorted][reference]libvmaf)。

媒体文章:

ffmpeg -i distorted-file -i reference-file -lavfi libvmaf -f null –

FFMpeg 手册:

ffmpeg -i main.mpg -i ref.mpg -lavfi libvmaf -f null -

扭曲文件的索引=0 参考文件的索引=1。由于没有任何重命名/重新映射,它们将按原始顺序发送到 libvmaf:0 然后 1(先乱序然后引用)。它等于[0][1]libvmaf。因此,提供给 libvmaf 的视频流顺序与 Netflix 手册中的完全相同。

如果您只比较两个视频,最好保持原始顺序,否则人们可能会感到困惑。

但是,我的 FFmpeg GUI ( FFMetrics ) 中确实有相反的顺序。原因是——可以给程序指定多个失真文件,这样更容易理解和使用:ffmetrics.exe [options] ref distorted1 [distorted2] [distorted3] [distorted4] ...

您的命令行也是正确的: ffmpeg -i reference -i distorted [0]...[refdeint];[refdeint]...[ref]; 1 ...[b];[b]...[c];[c][ref]libvmaf...

在以正确顺序提供给 libvmaf 的所有重新映射流之后:扭曲然后引用。您不能在那里交换两个“-i 文件”选项,因为这会极大地改变您的逻辑。

PS这是实际发生的事情的简化版本:)

于 2021-05-20T04:12:23.897 回答
0

FFmpeg 过滤器期望第一个输入是编码的视频流,第二个输入是参考流。

可能(我没有检查过)VMAF 计算相对于输入是对称的,所以实际上,顺序可能无关紧要。

于 2021-05-19T09:22:08.833 回答