“过去的X.XXX太大”是什么意思?
当使用ffmpeg编码H.264时,我总是得到以下types的警告:
Past duration 0.603386 too large Past duration 0.614372 too large Past duration 0.606377 too large
他们的意思是什么? 我没有find任何清晰的在线或在ffmpeg文档。
SourceForge上DVDStyler项目的维护者之一就这样说过:
2015年1月15日之后的FFMpeg版本经常会显示此警告。 它已被添加警告可能的速率控制失真,否则不会造成任何伤害。
查看源代码 ,似乎是inputstream中的呈现时间(pts)与输出stream中的呈现时间(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; }
这只是一个快速浏览,所以请随时深入挖掘。
我有这个错误,因为我想将一系列图像转换为video:
ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv
问题似乎是,如果没有帧速率给予input,则假设25fps的帧速率:
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%
错误信息通过设置input帧速率而不是输出帧速率而消失。 然后输出帧率将被自动select为input帧率。 另外在更新的ffmpeg版本中,你必须注意,因为只有当使用-i
选项使用PNG图像时,你必须使用-framerate
而不是-r
,参见-r
选项的文档 。
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv
也可以分别指定input和输出的帧速率:
ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv
在这种情况下,只有161/400帧将被编码。 其他的临时帧将被丢弃。 此外,错误消息消失,我想为了不放慢ffmpeg垃圾邮件到标准输出,请参阅:
总结如下:当尝试将高帧速率源编码为低帧速率输出时,出现此警告消息,这意味着帧需要被丢弃。