使用 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 版本的事。

来自: stackoverflow.com