使用 ffmpeg 编码 H.264 时,我收到以下类型的警告:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
他们的意思是什么?
答案
我收到了数千条带有特定编码的警告。
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 同步,发现两个文件之间的同步没有明显差异。
ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -
和寻找"帧=
结果源视频的长度为 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 版本的事。