'Past duration X.XXX too large' 是什么意思?
What does 'Past duration X.XXX too large' mean?
使用 ffmpeg 编码 H.264 时,我收到以下类型的警告:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
它们是什么意思?我没有在网上或 ffmpeg 文档中找到任何明确的内容。
查看 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;
}
这只是快速浏览,所以请随意深入挖掘。
SourceForge 上 DVDStyler 项目的维护者之一说 this 关于它:
FFMpeg versions after Jan 15 2015 often display this warning. It has
been added to warn about possible rate control distortion, otherwise
it does not cause any harm.
尝试将高帧率源编码为低帧率输出时会出现此警告消息,这意味着需要丢弃帧。
我遇到这个错误是因为我想将一系列图像转换为视频:
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
选项或 image2
或 v4l2
输入格式的 PNG 图像时,您必须使用 -framerate
请参阅 documentation for the -r
option 而不是 -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,请参阅:
我收到了数千条带有特定编码的警告。我正在将 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。
根据 FFmpeg 问题 #4700 -
过去的持续时间 0.999992 太大
这只是一个警告。
使用-loglevel
选项停止它:
ffmpeg -loglevel quiet -i input_file.xyz ....
可能的级别是数字或:
"quiet"
"panic"
"fatal"
"error"
"warning"
"info"
"verbose"
"debug"
"trace"
命令实际上应该是:
ffmpeg -loglevel quiet -i input_file.xyz ...
"quiet" 参数没有“-”前缀,因为它不是一个选项,而是“-loglevel”选项的一个值。
使用 ffmpeg 编码 H.264 时,我收到以下类型的警告:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
它们是什么意思?我没有在网上或 ffmpeg 文档中找到任何明确的内容。
查看 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;
}
这只是快速浏览,所以请随意深入挖掘。
SourceForge 上 DVDStyler 项目的维护者之一说 this 关于它:
FFMpeg versions after Jan 15 2015 often display this warning. It has been added to warn about possible rate control distortion, otherwise it does not cause any harm.
尝试将高帧率源编码为低帧率输出时会出现此警告消息,这意味着需要丢弃帧。
我遇到这个错误是因为我想将一系列图像转换为视频:
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
选项或 image2
或 v4l2
输入格式的 PNG 图像时,您必须使用 -framerate
请参阅 documentation for the -r
option 而不是 -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,请参阅:
我收到了数千条带有特定编码的警告。我正在将 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。
根据 FFmpeg 问题 #4700 - 过去的持续时间 0.999992 太大 这只是一个警告。
使用-loglevel
选项停止它:
ffmpeg -loglevel quiet -i input_file.xyz ....
可能的级别是数字或:
"quiet"
"panic"
"fatal"
"error"
"warning"
"info"
"verbose"
"debug"
"trace"
命令实际上应该是:
ffmpeg -loglevel quiet -i input_file.xyz ...
"quiet" 参数没有“-”前缀,因为它不是一个选项,而是“-loglevel”选项的一个值。