为什么帧速率加倍会产生不一致的帧?

Why does doubling the frame rate generate inconsistent frames?

所以我有一个恒定的 59.94 fps (i.e. 60000/1001) 视频,当我尝试提取一秒钟时:

ffmpeg -y -i input60fps.avi -ss 0 -t 1 -c:v huffyuv -an output60fps.avi
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ./output60fps.avi

它 returns 1.001 秒,我现在明白这是合适的,因为它是视频帧时间的倍数 (60000/1001 seconds) 最接近请求的持续时间。

在之前从 29.97 fps 源转换的 59.94 fps 视频上重复这个实验,我希望得到类似的结果,但我发现事实并非如此:

ffmpeg -i input30fps.avi -vcodec huffyuv -r 60000/1001 -an output60fps.avi
ffmpeg -i ./output60fps.avi -ss 0 -t 1 -c:v huffyuv -an test.avi
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 ./test.avi

这实际上是 0.984317 秒。

为什么这种行为不同?有没有什么方法可以控制总帧数如何均匀分布,使每个边界每 60000/1001 毫秒出现一次?我的期望是,由于我只是将帧速率加倍,所以我应该期望每 1001/60000 秒有一个帧。

AVI 是一个可变帧率的多路复用器。除了-r,您还需要启用恒定帧率,所以

ffmpeg -i input30fps.avi -vcodec huffyuv -r 60000/1001 -vsync cfr -an output60fps.avi