作为问题的背景,我使用一个程序生成的复杂过滤器从许多输入中合成一个视频。小错误会累积起来,所以我需要精确的修剪(重新编码就可以了)。
例如,我需要从链接视频(FPS=30)的给定帧开始的 44 帧。
以下是两次尝试(使用ffmpeg
版本 6.1.1):
尝试 1:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7333,setpts=PTS-STARTPTS" -an output.mp4
尝试2:
ffmpeg -i input.mp4 -vf "trim=start=3.2666666666666666:end=4.7334,setpts=PTS-STARTPTS" -an output.mp4
虽然时间戳的差异end
只有 0.0001,但第一次尝试产生了 43 帧(持续时间为 1.433333 秒),而第二次尝试产生了 45 帧(持续时间为 1.50 秒)。无论我在时间戳中输入什么end
,我都无法获得 44 帧...
我通过以下方式获取帧数:
ffprobe -show_frames output.mp4 | grep FRAME | wc -l
(将此数字除以二,因为同时计算[FRAME]
和[/FRAME]
)
如何解释这种行为?我怎样才能有预见地修剪我需要的帧?
更新start_frame
如果我使用和,会观察到相同的行为end_frame
。对于从 98 到 141 的范围,我得到 43 帧。对于从 98 到 142 的范围,我得到 45 帧。我无法得到 44...