“过去的持续时间 X.XXX 太大”是啥意思?

Posted

技术标签:

【中文标题】“过去的持续时间 X.XXX 太大”是啥意思?【英文标题】:What does 'Past duration X.XXX too large' mean?“过去的持续时间 X.XXX 太大”是什么意思? 【发布时间】:2015-08-27 06:22:20 【问题描述】:

当使用 ffmpeg 编码 H.264 时,我会收到以下类型的警告:

Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large

它们是什么意思?我没有在网上或 ffmpeg 文档中找到任何明确的内容。

【问题讨论】:

请将 ffmpeg 问题发送至video.stackexchange.com beta。请参阅 ffmpeg 标签说明。 @Ondra 甚至是另一个 stackexchange?我对那 100 多个子站点感到困惑,我不确定这是否是 stackexchange 的积极方向。 @mxmlnkn 我同意,它让你渴望更简单的时代...... :) 我认为是。 *** 是用来编程的,这不是编程。有一个视频处理问答网站,这是一个关于视频处理的问题。有什么不明白的? 另请阅读标签说明。 【参考方案1】:

我收到了数千条带有特定编码的警告。我正在将 1080p 视频缩小到 480p。在一个编辑点,由于源激光光盘的缺陷而出现了一些不可靠的视频,这些消息开始出现,然后出现在我认为之后的每一帧中。他们继续说下去,就像这个简短的摘录:

Past duration 0.901115 too large=  535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 31 times
Past duration 0.901115 too large=  535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 34 times
Past duration 0.901115 too large=  535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 36 times
Past duration 0.901115 too large=  535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x    
    Last message repeated 39 times

最初的 ffmpeg 调用是这样的:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower \
                              -crf 17 -c:a copy -y output.mkv

根据此处的建议,我首先在输入中添加了-framerate 60000/1001。那并没有改善什么。我保留了-framerate 并将-r 60000/1001 添加到输出中。那仍然没有任何改善。保留两者我最后添加了-async 1 -vsync 1。这导致我收到一个警告,仅此而已。该调用是:

ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 \
           -preset slower -crf 17 -c:a copy -y output.mkv \
           -r 60000/1001 -async 1 -vsync 1

我在 MediaInfo 的详细转储中发现的唯一区别是删除了在原始调用中发现的这一行,但在第二个调用中没有:

Delay relative to video                  : -33ms

但是,我检查了文件开头和结尾附近的 A/V 同步,两个文件之间的同步没有明显差异。它们的运行时间也相同,但在 VLC 中仅测量到最接近的秒数。所以我像这样使用ffmpeg检查了帧数:

ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -

并在输出末尾附近寻找“frame=#”。

原来源视频的长度为 375226 帧,原始调用产生 375195 帧,第二次调用产生 375200 帧。因此,第二次调用(警告消息少得多)也少丢了 5 帧。

随后的测试表明-framerate-r 是不必要的,只使用两个同步标志就足够了。这与上面的第二次调用产生了相同的结果,所以我发现解决问题的第三个也是最简单的调用是这样的:

ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower \
                   -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1

即使有同步标志,另一个文件随后也产生了一堆这样的警告,但是添加回速率标志“修复”了它(只产生了两个而不是数千个警告)。因此,有时第二次调用有效,而第三次无效。为了我的直接目的,我将解决第二次调用,并希望它能解决大部分问题。

这都是 ffmpeg 4.0 版的。

【讨论】:

谢谢你!经过几天的问题,-async 1 -vsync 1 为我修复了它。 感谢@larryy 非常有帮助的分析 感谢您的详尽回答。您能否解释一下这些同步标志的实际作用? 即使使用-async 1 -vsync 并指定或不指定输入速率以将我用手机拍摄的视频转换为另一种格式,我仍然会收到这些警告。您知道在这种情况下问题可能与什么有关吗?【参考方案2】:

根据FFmpeg issue #4700 - Past duration 0.999992 too large 这只是一个警告。

使用-loglevel 选项来阻止它:

ffmpeg -loglevel quiet -i input_file.xyz ....

可能的级别是数字或:

"quiet"
"panic"
"fatal"
"error"
"warning"
"info"
"verbose"
"debug"
"trace"

【讨论】:

【参考方案3】:

该命令实际上应该是:

ffmpeg -loglevel quiet -i input_file.xyz ...

“quiet”参数没有“-”前缀,因为它不是一个选项,而是“-loglevel”选项的一个值。

【讨论】:

【参考方案4】:

在尝试将高帧率源编码为低帧率输出时会出现此警告消息,这意味着需要丢弃帧。


我遇到此错误是因为我想将一系列图像转换为视频:

ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv

问题似乎是,如果没有为输入提供帧速率,则假定帧速率为 25 fps:

Input #0, image2, from 'frames/%04d.bmp':
  Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc

这也可以从编码的总帧数上看出。我有 400 张图片,但上面的命令只编码了 384:

frame=  384 fps= 68 q=-1.0 Lsize=   10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15    
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%

通过设置输入帧速率而不是输出帧速率,错误消息会消失。然后将自动选择输出帧速率作为输入的帧速率。此外,在较新的 ffmpeg 版本中,您必须注意,因为当使用带有 -i 选项或更确切地说是 image2v4l2 输入格式的 PNG 图像时,您必须使用 -framerate 而不是 -r,请参阅documentation for the -r option。

ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv

也可以分别指定输入和输出的帧率:

ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv

在这种情况下,只有 161/400 帧将被编码。其他临时帧将被丢弃。 错误消息也消失了,我想是为了不通过向标准输出发送垃圾邮件来减慢 ffmpeg,请参阅:

https://trac.ffmpeg.org/ticket/4700 https://trac.ffmpeg.org/ticket/4401

【讨论】:

"因为只有在使用带有 -i 选项的 PNG 图像时,您必须使用 -framerate 而不是 -r" - 这完全解决了我的问题,谢谢! 在尝试将 wmv 转换为 mp4 时,使用 -r 有效,而使用 -framerate 无效。 +1,我建议将您的“总结”移到顶部。更多,因为它解决了我将图像转换为视频并尝试增加输出帧速率并加快输出的情况。我从这个ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4" 开始到这个没有更多警告ffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"(注意-framerate 50 添加用于输入)【参考方案5】:

SourceForge 上 DVDStyler 项目的维护者之一说 this 关于它:

2015 年 1 月 15 日之后的 FFMpeg 版本经常显示此警告。它有 添加以警告可能的速率控制失真,否则 它不会造成任何伤害。

【讨论】:

'速率控制失真'与(主要是视频)编码有关,与此警告无关,即输出时间戳与输入时间戳相比是否(相对)差异太大 前几次我收到警告我终止了转换,但这个建议让我让它运行并且警告在一段时间后停止并且转换成功完成。谢谢。【参考方案6】:

查看source code 似乎是输入流中的呈现时间 (pts) 与输出流中的呈现时间 (pts) 之间的差异超过了设置为 0.6 的固定限制。

来自源代码的片段:

    delta0 = sync_ipts - ost->sync_opts;
    delta  = delta0 + duration;

...

        if (delta0 < 0 &&
        delta > 0 &&
        format_video_sync != VSYNC_PASSTHROUGH &&
        format_video_sync != VSYNC_DROP) 
        double cor = FFMIN(-delta0, duration);
        if (delta0 < -0.6) 
            av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
         else
            av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
        sync_ipts += cor;
        duration -= cor;
        delta0 += cor;
    

这只是一个快速浏览,所以请随时深入挖掘。

【讨论】:

我们可以做些什么来“修复”这个问题,或者明确设置输出点? 我不记得有关此问题的详细信息,但如果“修复”是指消除警告,则根据上述代码,您可以查看选项 format_video_sync = VSYNC_DROP 或 @987654325 @ 并查看其中一个在您的用例中是否可行。 谢谢。我发现使用-r 开关显式设置帧速率“修复”了这些警告。 只是个人经验:我遇到了“过去持续时间”消息垃圾邮件问题,并通过使用 -r 25 强制输入帧速率解决了这个问题,但后来我开始让音频严重不同步。删除 -r 选项并使用“-async 1 -vsync 1”来防止音频不同步已经防止了音频问题,但“过去持续时间”的垃圾邮件似乎也消失了。 在 v 4.1 及以后的版本中,日志级别已经升级,所以不会出现在默认日志级别。

以上是关于“过去的持续时间 X.XXX 太大”是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

rest是啥意思

interrupted是啥意思

channel中文是啥意思

override是啥意思

buffer是啥意思,缓冲翻译

sequence是啥意思