首页 > 解决方案 > 如何在使用 ffmpeg 计算 vmaf 分数时同步帧

问题描述

我有一个源视频和该源的编码器版本。现在我需要找到 vmaf 分数。但是我读到,为了确保正确的 vmaf 分数,源视频和编码视频都保持帧同步是很重要的。你能告诉我如何在ffmpeg中使用解码流上的过滤器来做到这一点。我

我有如下命令

ffmpeg2 -i 11sec_encoded_720p_200k.mp4 -i 11sec_original_1080p.mxf -filter_complex "[0:v]scale=1920x1080:flags=bicubic[main]; [main][1:v]libvmaf=model_path=vmaf_v0.6.1.pkl:psnr=1:ssim=1:ms_ssim=1:log_fmt=json:log_path=720p_200k.json" -report -f null -

标签: ffmpeg

解决方案


您可以使用trim过滤器来处理<offset>您的输入视频之间,即

  • 11sec_encoded_720p_200k.mp4如果( Distorted )的第一帧比11sec_original_1080p.mxf( Reference )领先,trim则通过指定值应用于Reference 。应该是参考视频<offset>上的以秒为单位的 值,其中它的帧与失真的第一帧匹配(请参见下图的命令):<offset>
ffmpeg2 -i 11sec_encoded_720p_200k.mp4 -i 11sec_original_1080p.mxf -filter_complex "[0:v]scale=1920x1080:flags=bicubic[main];[1:v]trim=start=<you offset> [ref];[main][ref]libvmaf=model_path=vmaf_v0.6.1.pkl:psnr=1:ssim=1:ms_ssim=1:log_fmt=json:log_path=720p_200k.json" -report -f null -

图像1

  • 否则,如果11sec_original_1080p.mxf( Reference11sec_encoded_720p_200k.mp4 ) 在( Distorted )方面领先,则适用trimDistorted(参见下面的命令图像):
ffmpeg2 -i 11sec_encoded_720p_200k.mp4 -i 11sec_original_1080p.mxf -filter_complex "[0:v]trim=start=<you offset> [main0];[main0]scale=1920x1080:flags=bicubic[main];[main][1:v]libvmaf=model_path=vmaf_v0.6.1.pkl:psnr=1:ssim=1:ms_ssim=1:log_fmt=json:log_path=720p_200k.json" -report -f null -

在此处输入图像描述

上面的例子认为你已经知道正确的偏移量,如果不是这样,你需要计算它。可以使用失真视频的样本并逐帧(向前和向后)滑动它来完成此计算,以便查找关于Reference. 一旦找到最佳 PSNR,滑动的时间量就是使帧同步所需的偏移量。在这里,您可以找到已经处理此问题的 python 脚本:https ://github.com/gdavila/easyVmaf


推荐阅读