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
其中 17
是 number of frames to be used
/ input rate
我有一个包含 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
其中 17
是 number of frames to be used
/ input rate