Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Video 比较两个视频的PSNR,可能是ffmpeg?_Video_Ffmpeg - Fatal编程技术网

Video 比较两个视频的PSNR,可能是ffmpeg?

Video 比较两个视频的PSNR,可能是ffmpeg?,video,ffmpeg,Video,Ffmpeg,我想把大量的视频与一个好的参考视频进行比较,以便找到质量差的视频。我想通过调用命令行实用程序在批处理模式下实现这一点,我已经以这种方式使用ffmpeg来捕获视频帧 如果我对视频进行转码,ffmpg会给我一个PSNR值来比较输入和输出视频。我的印象是我可以用这样的东西来比较两个单独的视频,但找不到方法 我会更好地从每个视频中抓取一帧,并以某种方式进行比较吗?PSNR可能不是我的最佳选择 我不是在寻找质量上的细微差别,而是寻找诸如同步问题或大量降雪等重大差别 有什么建议吗?提前感谢:-)ffmpeg

我想把大量的视频与一个好的参考视频进行比较,以便找到质量差的视频。我想通过调用命令行实用程序在批处理模式下实现这一点,我已经以这种方式使用ffmpeg来捕获视频帧

如果我对视频进行转码,ffmpg会给我一个PSNR值来比较输入和输出视频。我的印象是我可以用这样的东西来比较两个单独的视频,但找不到方法

我会更好地从每个视频中抓取一帧,并以某种方式进行比较吗?PSNR可能不是我的最佳选择

我不是在寻找质量上的细微差别,而是寻找诸如同步问题或大量降雪等重大差别


有什么建议吗?提前感谢:-)

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用户会更有用,特别是对于已经有公认答案的问题。请参阅:。