ffmpeg timelapse 在帧大小变化时重置 PTS

问题描述 投票:0回答:1

我有 601 个连续图像,它们在第 36 帧和第 485 帧上更改大小和纵横比,在集合中创建 3 种不同大小的图像。

我想创建一个延时拍摄并删除前 200 帧,只显示剩余的 401 帧,但如果我对输入进行修剪过滤器,过滤器会将不同大小帧的 3 个部分中的每一个部分视为单独的“流”他们自己重置 PTS,所有这些都在完全相同的时间开始。这意味着以下命令的最终输出只有 249 帧长,而不是 401。

我该如何解决这个问题,以便只获得最终的 401 帧?

ffmpeg \
-framerate 60 \
-i "./%07d.jpg" \
-filter_complex "
 [0]scale=1000:1000[in1];
 [in1]trim=start_frame=200[in2];
 [in2]setpts=PTS-STARTPTS
 " \
-r 60 -y trimmed.webm

setpts=N/(60*TB)
setpts=PTS-SETPTS
scale
之后尝试修复帧时间的过滤器似乎也没有改变任何东西。

如果我删除修剪和点重置,游戏中时光倒流完美导出所有 601。 如果我删除点重置并保留修剪,它会从第 0 帧开始导出 449 帧。

除了调试状态输入在第 449 帧上达到 EOF 之外,没有与该问题相关的错误或警告。(由于某种原因,这是 485-36,两个部分的长度)

我知道预处理图像大小是解决此问题的一种方法,但我想了解为什么这在一个命令中是不可能的。

版本 6.0-6ubuntu1,但也发生在 6.1 和 5.1 上。

即使我将其削减到最低限度,它仍然错误地导出 450 帧:

ffmpeg -i "./%07d.jpg" -filter setpts=PTS-STARTPTS -y tpad.webm

ffmpeg
1个回答
0
投票

当视频流中途改变参数时,ffmpeg 会重新配置过滤器图,因为只有少数过滤器能够可靠地适应这种变化。所以你必须告诉 ffmpeg 避免重新配置过滤器图。您仍然需要将图像缩放到一致的尺寸。

此外,如果您想跳过初始图像集,只需从所需的起点开始摄取图像即可。

ffmpeg \
-reinit_filter 0 \
-start_number 200 \
-framerate 60 \
-i "./%07d.jpg" \
-vf "scale=1000:1000" \
-y trimmed.webm
© www.soinside.com 2019 - 2024. All rights reserved.