ffmpeg 中忽略了 vframes 选项?

vframes option ignored in ffmpeg?

我有一个包含 2001 个 PNG 文件的目录。我可以使用 ffmpeg 和以下命令将所有帧转换为 mp4 视频:

ffmpeg -framerate 60 -start_number 0 \
-i pic.comp2.%07d.png -c:v libx264 -r 30 \
-pix_fmt yuv420p input1ia.mp4

这很好用。但是,我正在创建一个更复杂的应用程序,它只需要读取目录中的前 1020 个文件(特别是 0 到 1019)。一些谷歌搜索让我找到了 -vframes 选项。我的问题是——它似乎被忽略了,或者至少被解释得与我预期的不同。

我修改后的命令如下:

ffmpeg -framerate 60 -start_number 0 \
-i pic.comp2.%07d.png -vframes 1020 -c:v libx264 
-r 30 -pix_fmt yuv420p input1.mp4

好像很多和我做同样事情的人都没有遇到这个问题。所以我做了更多的挖掘。我尝试将 vframes 从 1020 更改为 -vframes 20,这似乎工作正常。所以现在我想这可能是 -framerate-r 之间的某种不匹配?

完整 生成的视频长 33 秒...这在数学上是有道理的。

 1 sec
 ---------   x  2001 frames = 33.35 seconds
 60 frames

这就是为什么我认为将 ~1/2 的 PNG 指定为 'end point' 会产生前 ~16-17 秒的视频。但我总是通过使用 -vframes 选项获得完整长度的视频。

我假设我对 -vframes 的输入在数学上一定是不正确的,因为少数帧似乎有效。但是,我不明白为什么。

我似乎能做出的最有根据的猜测是它正在以 60fps (-framerate) 读取 PNG,但是 -r 使输出视频为 30fps 或什么?但是,我会假设完整的输出视频不会长 33 秒。

当输入和输出速率不匹配时,ffmpeg 会按照常规方案丢弃或复制帧以达到输出速率。因此,对于 60 的输入速率和 30 的输出速率,将丢弃一半的帧。使用 vframes 选项,输出速率为 30 的 1020 帧应该产生持续时间 1020/30 = 34 秒的视频。

要实现您想要的效果,请使用 t 选项

ffmpeg -framerate 60 -start_number 0 -t 17 \
-i pic.comp2.%07d.png -c:v libx264 -r 30 \
-pix_fmt yuv420p input1ia.mp4

其中 17number of frames to be used / input rate