“过去时长X.XXX太大”是什么意思?


142

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

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

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


2
请将ffmpeg问题定向video.stackexchange.com beta。请参阅ffmpeg标记说明。
2016年

34
@Ondra还有另一个stackexchange吗?我对这100多个子站点感到困惑,我不确定这是否是stackexchange前进的积极方向。
mxmlnkn

1
@mxmlnkn我同意,它让您渴望简单的时间... :)
Erik

4
我觉得是这样的。StackOverflow用于编程,不是编程。有一个视频处理的问答站点,这是有关视​​频处理的问题。什么不明白?
OndraŽižka17年

另请阅读标签说明。
OndraŽižka17年

Answers:


23

我收到了成千上万种带有特定编码的警告。我将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 -vsync1。这导致我收到一个警告,仅此而已。该调用是:

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就是所有这些。


2
这次真是万分感谢!经过几天的问题,-async 1 -vsync 1为我修复它。
Offek

1
感谢您的分析@larryy非常有帮助
deepelement

90

SourceForge上DVDStyler项目的维护者之一对此表示了这样的看法:

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


“速率控制失真”与(主要是视频)编码相关,并且与此警告无关,该警告有关输出时间戳与输入时间戳相比(相对)是否相差太大
Gyan

收到警告的前几次我终止了转换,但是此建议使我让它运行,并且一段时间后警告停止,转换成功完成。谢谢。
IRTFM

58

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


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

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版本中,您必须格外小心,因为在将PNG图片与-i选项或image2v4l2输入格式一起使用-framerate-r,必须使用代替,请参阅选项文档-r

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帧进行编码。其他临时帧将被丢弃。错误消息也消失了,我想为了不通过向stdout发送垃圾邮件来减慢ffmpeg的速度,请参阅:


3
“因为仅当通过-i选项使用PNG图像时,才必须使用-framerate而不是-r”-完全解决了我的问题,谢谢!
匿名

1
在尝试将wmv转换为mp4时,-r-framerate没有使用的情况下使用work。
1934286

+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输入内容)
el-teedee

49

查看源代码,似乎是输入流中的呈现时间(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;
    }

这只是一眼,所以请随时深入了解。


我们有什么办法可以“解决”此问题,或显式设置输出点?
Baodad '17

1
我不记得有关此问题的详细信息,但是如果通过“修复”表示摆脱警告,那么根据上述代码,您可以调查该选项,format_video_sync = VSYNC_DROP或者format_video_sync = VSYNC_PASSTHROUGH查看其中一个在您的用例中是否可行。
Erik

谢谢。我发现使用-r开关“固定”了这些警告来明确设置帧速率。
Baodad

1
仅来自个人经验:我遇到了“过去持续时间”消息垃圾邮件问题,并通过使用-r 25强制输入帧速率来解决该问题,但是随后我开始使音频严重不同步。删除-r选项并使用“ -async 1 -vsync 1”防止音频不同步可以防止音频问题,但是“过去的时间”垃圾邮件似乎也消失了。
杰森·朗

在v 4.1和更高版本中,日志级别已升级,因此它不会出现在默认日志级别。
吉安


1

该命令实际上应该是:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.