ffmpeg - 如何在使用 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 -
解决方案
您可以使用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 -
- 否则,如果
11sec_original_1080p.mxf
( Reference11sec_encoded_720p_200k.mp4
) 在( Distorted )方面领先,则适用trim
于Distorted(参见下面的命令图像):
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
推荐阅读
- php - 在 PHP 中的 mySQL Server 上执行存储过程时如何获取 lastInsertID?
- javascript - 如何在反应中没有eval()的情况下从一个输入计算值
- javascript - 不兼容的 Bable 版本 React
- javascript - 通过调用返回要打开的jsp名称的java方法打开新标签jsp
- ios - 删除collectionView中特定位置的特定单元格
- julia - 如何在 Julia 中表示抽象时间
- python - 由于版本问题,安装 virt-manager 时出错
- javascript - NodeJS:发送电子邮件(例如向我的应用程序的用户发送通知)无需对其进行身份验证或接收电子邮件
- cmake - 如何在 cmake 中正确链接库?
- python - PyCharm 中未解决的引用错误,即使代码运行正常