【问题标题】:Comparing PSNR of two videos, possibly with ffmpeg?比较两个视频的 PSNR,可能是 ffmpeg?
【发布时间】:2013-11-07 16:13:58
【问题描述】:

我想将大量视频与一个好的参考视频进行比较,以便找到质量较差的视频。我想通过调用命令行实用程序以批处理模式执行此操作,我已经以这种方式使用 ffmpeg 来抓取视频帧。

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

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

我不是在寻找质量上的微小差异,而是寻找主要差异,例如同步问题或大量降雪。

有什么建议吗?在此先感谢:-)

【问题讨论】:

    标签: video ffmpeg


    【解决方案1】:

    这是您在 ffmpeg 中使用 psnr filter 比较两个单独视频的方式:

    ffmpeg -i input_video.mp4 -i reference_video.mp4 -filter_complex "psnr" -f null /dev/null
    

    在 Windows 上,将 /dev/null 替换为 NUL

    文档说input_video 将原封不动地传递给output_videopsnr 值将显示在命令行上。

    【讨论】:

    • 因为你不需要输出,如果你将它发送到 null 多路复用器,运行速度会快很多:-f null -
    • @llogan @pewpew 只是想知道如果reference_video.mp4 和input_video.mp4 的帧数不同,是否可能存在问题?比如,reference_video.mp4 有 3477 帧,而 input_video.mp4 有 3469 帧?手机转码器可能会丢帧。
    • @tli2020 参考视频可能是 VFR。用 ffmpeg 重新编码创建的视频是 CFR;通过丢弃或复制帧以使帧速率恒定而创建。
    【解决方案2】:
    .\..\ffmpeg -i [Input] -i [Output] -lavfi  psnr="stats_file=psnr.log" -f null -
    

    我正在查看 ssim 命令 (https://ffmpeg.org/ffmpeg-all.html#ssim) 并决定尝试使用 psnr 命令来查看是否可以获得任何有用的结果。对我来说似乎很有用。日志文件有一个 mse_avg 值,我发现它对于检测我生成的视频中的宏块很有用。

    http://www.mathworks.com/help/vision/ref/psnr.html 帮助我理解了 mse 和 psnr 的含义。

    【讨论】:

    • 有效!一个不错的答案。顺便说一句,Netflix 有一个更准确的视频质量指标“VMAF”,它是开源的!
    【解决方案3】:

    ffmpeg 有一个 psnr 过滤器:

    .. psnr             VV->V      Calculate the PSNR between two video streams.
    

    详情请见https://trac.ffmpeg.org/wiki/FilteringGuide

    【讨论】:

      【解决方案4】:

      ffmpeg 可以在编码期间计算 PSNR 和 SSIM,但要比较我使用的 2 个视频AVISynth compare

      【讨论】:

        【解决方案5】:

        如果你想用 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();
        }
        

        【讨论】:

        • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用,特别是对于已经有一个已接受答案的问题。请参阅:How do I write a good answer
        【解决方案6】:

        我不确定它有多合适,但我只是通过在输入和输出视频的转码过程中获取 psnr,然后使用 psnr 过滤器比较相同的输入和输出视频来进行试验。不过,这两种情况下的 psnr 值不同。

        我得到了这个用于转码:

        PSNR 平均 Y:27.458 U:40.780 V:41.989 Avg:29.130 Global:28.996 kb/s:25.71

        转码器 psnr 的文档仅说明:“计算压缩帧的 PSNR。”

        这个用于过滤器:

        PSNR 平均值:24.30 min:23.09 max:30.50

        对于过滤器,文档指出:“过滤器存储每帧的累积 MSE(均方误差),并在处理结束时对所有帧进行平均,并应用以下公式获得PSNR:PSNR = 10*log10(MAX^2/MSE)"

        我可能会选择过滤器或转码器来一致地计算我需要比较的所有视频的 psnr,因此绝对值对我来说并不重要。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-20
          • 2018-12-27
          • 2018-05-30
          • 2017-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多