Video 比较两个视频的PSNR,可能是ffmpeg?
我想把大量的视频与一个好的参考视频进行比较,以便找到质量差的视频。我想通过调用命令行实用程序在批处理模式下实现这一点,我已经以这种方式使用ffmpeg来捕获视频帧 如果我对视频进行转码,ffmpg会给我一个PSNR值来比较输入和输出视频。我的印象是我可以用这样的东西来比较两个单独的视频,但找不到方法 我会更好地从每个视频中抓取一帧,并以某种方式进行比较吗?PSNR可能不是我的最佳选择 我不是在寻找质量上的细微差别,而是寻找诸如同步问题或大量降雪等重大差别Video 比较两个视频的PSNR,可能是ffmpeg?,video,ffmpeg,Video,Ffmpeg,我想把大量的视频与一个好的参考视频进行比较,以便找到质量差的视频。我想通过调用命令行实用程序在批处理模式下实现这一点,我已经以这种方式使用ffmpeg来捕获视频帧 如果我对视频进行转码,ffmpg会给我一个PSNR值来比较输入和输出视频。我的印象是我可以用这样的东西来比较两个单独的视频,但找不到方法 我会更好地从每个视频中抓取一帧,并以某种方式进行比较吗?PSNR可能不是我的最佳选择 我不是在寻找质量上的细微差别,而是寻找诸如同步问题或大量降雪等重大差别 有什么建议吗?提前感谢:-)ffmpeg
有什么建议吗?提前感谢:-)ffmpeg可以在编码过程中计算PSNR和SSIM,但要比较我使用的两个视频,ffmpeg有一个PSNR过滤器:
.. psnr VV->V Calculate the PSNR between two video streams.
有关详细信息,请参见这是如何使用ffmpeg中的来比较两个单独的视频:
ffmpeg -i input_video.mp4 -i reference_video.mp4 -filter_complex "psnr" -f null /dev/null
在Windows上,将/dev/null
替换为NUL
文档说明,
input\u video
将原封不动地传递到output\u video
,并且psnr
值将显示在命令行上。我不确定它是否合适,但我只是在输入和输出视频转码期间通过获取psnr进行了一次尝试,然后使用psnr滤波器比较相同的输入和输出视频。但两种情况下的峰值信噪比值都不同
我得到了这个代码转换:
峰值信噪比平均Y:27.458 U:40.780 V:41.989平均值:29.130全局:28.996 kb/s:25.71
转码器psnr的文档仅说明:“计算压缩帧的psnr。”
对于过滤器:
平均峰值信噪比:24.30最小值:23.09最大值:30.50
对于滤波器,文档中规定:“滤波器存储每个帧的累积MSE(均方误差),并在处理结束时平均所有帧的平均值,并应用以下公式获得PSNR:PSNR=10*log10(最大^2/MSE)”
我可能会选择过滤器或转码器,以便在需要比较的所有视频中一致地计算psnr,所以绝对值对我来说并不重要
.\..\ffmpeg -i [Input] -i [Output] -lavfi psnr="stats_file=psnr.log" -f null -
我查看了ssim命令()并决定在psnr命令中尝试它,看看是否可以得到任何有用的结果。对我来说似乎很有用。日志文件有一个mse_avg值,我发现该值对于检测我生成的视频中的宏块非常有用
帮助我理解了mse和psnr的含义。如果要使用FFmpeg计算psnr,请使用替代命令
ffmpeg -i [Input1] -i [Input2] -lavfi psnr -f null -
ffmpeg -i [Input1] -i [Input2] -filter_complex psnr -f null -
例外输出
ffmpeg version git-2019-11-22-27c6c92 Copyright (c) 2000-2019 the FFmpeg developers
...
[Parsed_psnr_0 @ 000001e47a2bee40] PSNR y:9.145728 u:22.375364 v:23.917491 average:10.819717 min:9.523630 max:14.456108
如果您使用java的JAVE2库来处理视频
function void calculatePSNR(String in1, String in2){
FFMPEGExecutor ffmpeg = new DefaultFFMPEGLocator().createExecutor()
ffmpeg.addArgument("-i");
ffmpeg.addArgument(in1);
ffmpeg.addArgument("-i");
ffmpeg.addArgument(in2);
ffmpeg.addArgument("-lavfi");
ffmpeg.addArgument("psnr");
ffmpeg.addArgument("-f");
ffmpeg.addArgument("null");
ffmpeg.addArgument("-");
try {
ffmpeg.execute();
} catch (IOException e) {
e.printStackTrace();
ffmpeg.destroy();
}
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(ffmpeg.getErrorStream()));
int lineNR = 0;
String line;
while((line = reader.readLine()) != null) {
if (line.contains("PSNR")){
System.out.println(line);
}
lineNR++;
}
} catch (IOException e) {
e.printStackTrace();
ffmpeg.destroy();
}
ffmpeg.destroy();
}
因为您不需要输出,所以如果将输出发送到空muxer,运行速度会快得多:-f null-@llogan@pewpew只是想知道如果引用_video.mp4和输入_video.mp4具有不同的帧数,是否会有问题?比如,参考视频.mp4有
3477
帧,而输入视频.mp4有3469
帧?移动电话中的转码器可能会丢失一些帧。@tli2020参考视频可能是VFR。用ffmpeg重新编码后生成的视频为CFR;通过删除或复制帧来创建恒定的帧速率。它可以工作!很好的回答。顺便说一句,Netflix有一个更准确的视频质量指标“VMAF”,它是开源的!当回答一个老问题时,如果您包含一些上下文来解释您的答案是如何有帮助的,那么您的答案对其他StackOverflow用户会更有用,特别是对于已经有公认答案的问题。请参阅:。