将 vmaf 与 ffmpeg 一起使用的正确方法
Right way to use vmaf with ffmpeg
我正在尝试计算已处理视频与原始文件的 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 ffmpeg
的官方文档找到 here,它说 source/reference
文件后跟 encoded/distorted/processed
文件。
但我遇到的几乎所有博客都使用相反的 args 顺序,即 processed
文件后跟 original
文件。
几个例子:
https://medium.com/@eyevinntechnology/keep-an-eye-on-the-video-quality-b9bcb58dd5a1: 在里面搜索“Using VMAF within FFMPEG”
https://websites.fraunhofer.de/video-dev/calculating-vmaf-and-psnr-with-ffmpeg/: 在里面搜索"Metric Calculation with FFmpeg"
编辑
注意:更改顺序确实会更改 VMAF 分数。
FFmpeg 过滤器期望第一个输入是编码视频流,第二个输入是参考流。
可能(我没有检查过)VMAF 计算相对于输入是对称的,所以实际上,顺序可能无关紧要。
您如何在命令行中指定源文件并不重要。
视频流如何提供给 libvmaf 过滤器。
很重要
默认情况下,命令行中第一个指定的源将成为索引=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 -
请注意,index=0 的视频流(在命令行中第一个指定的那个)被重命名为 reference ([0:v]...[reference]
) 并且视频流与index=1(命令行中的第二个)重命名为 distorted ([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。
由于没有任何 renaming/remapping,它们将按原始顺序发送到 libvmaf:0 然后 1(乱序然后引用)。它等于 [0][1]libvmaf
。因此,提供给 libvmaf 的视频流顺序与 Netflix 手册中的顺序完全相同。
如果只比较两个视频,最好保持原来的顺序,否则人们可能会感到困惑。
但是,我的 FFmpeg GUI (FFMetrics) 中确实有相反的顺序。
原因是——可以为程序指定多个扭曲的文件,这样更容易理解和使用:
ffmetrics.exe [选项] 参考失真 1 [失真 2] [失真 3] [失真 4] ...
你的命令行也是正确的:
ffmpeg -i reference -i 扭曲 [0]...[refdeint];[refdeint]...[ref];1...[b];[b]...[c];[ c][ref]libvmaf...
在以正确顺序提供给 libvmaf 的所有重新映射流之后:扭曲然后引用。
您不能在那里交换两个“-i 文件”选项,因为这会显着改变您的逻辑。
P.S。这是实际发生的事情的简化版本:)
我正在尝试计算已处理视频与原始文件的 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 ffmpeg
的官方文档找到 here,它说 source/reference
文件后跟 encoded/distorted/processed
文件。
但我遇到的几乎所有博客都使用相反的 args 顺序,即 processed
文件后跟 original
文件。
几个例子:
https://medium.com/@eyevinntechnology/keep-an-eye-on-the-video-quality-b9bcb58dd5a1: 在里面搜索“Using VMAF within FFMPEG”
https://websites.fraunhofer.de/video-dev/calculating-vmaf-and-psnr-with-ffmpeg/: 在里面搜索"Metric Calculation with FFmpeg"
编辑
注意:更改顺序确实会更改 VMAF 分数。
FFmpeg 过滤器期望第一个输入是编码视频流,第二个输入是参考流。
可能(我没有检查过)VMAF 计算相对于输入是对称的,所以实际上,顺序可能无关紧要。
您如何在命令行中指定源文件并不重要。 视频流如何提供给 libvmaf 过滤器。
很重要默认情况下,命令行中第一个指定的源将成为索引=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 -
请注意,index=0 的视频流(在命令行中第一个指定的那个)被重命名为 reference ([0:v]...[reference]
) 并且视频流与index=1(命令行中的第二个)重命名为 distorted ([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。
由于没有任何 renaming/remapping,它们将按原始顺序发送到 libvmaf:0 然后 1(乱序然后引用)。它等于 [0][1]libvmaf
。因此,提供给 libvmaf 的视频流顺序与 Netflix 手册中的顺序完全相同。
如果只比较两个视频,最好保持原来的顺序,否则人们可能会感到困惑。
但是,我的 FFmpeg GUI (FFMetrics) 中确实有相反的顺序。 原因是——可以为程序指定多个扭曲的文件,这样更容易理解和使用: ffmetrics.exe [选项] 参考失真 1 [失真 2] [失真 3] [失真 4] ...
你的命令行也是正确的: ffmpeg -i reference -i 扭曲 [0]...[refdeint];[refdeint]...[ref];1...[b];[b]...[c];[ c][ref]libvmaf...
在以正确顺序提供给 libvmaf 的所有重新映射流之后:扭曲然后引用。 您不能在那里交换两个“-i 文件”选项,因为这会显着改变您的逻辑。
P.S。这是实际发生的事情的简化版本:)