如何准确延长小视频的时长?

How do I accurately extend the duration of a tiny video clip?

我注意到 ffmpeg 并不总是将剪辑的持续时间缩放到所需的值(甚至考虑到毫秒级的精度损失。)例如,每当我尝试将这个 67 毫秒的微小剪辑的持续时间缩放到 7秒数:

ffmpeg -i input.avi -filter:v "setpts=(7/0.067)*PTS" -an output.avi    

生成的视频时长仅为 3.5 秒。

不太确定为什么会关闭多秒,但我怀疑它与输入剪辑本身有关(只有 2 帧 @ 29.97 fps)到目前为止,我发现如果我缩放首先将持续时间设置为更大的值,然后将其缩减为 7 秒,效果很好:

ffmpeg -i input.avi -filter:v "setpts=(1000)*PTS" -an input_scaled_high.avi
ffmpeg -i input_scaled_high.avi -filter:v "setpts=(7/33.400033)*PTS" -an output.avi

但我希望我不需要求助于中间文件。是否可以通过单个 ffmpeg 调用解决此问题?

如果有帮助,这是我正在处理的视频文件:https://drive.google.com/drive/folders/1hI5Xo6kfAfMd8ZylM6XrPX5fuO88gncE?usp=sharing

注意:我应该提到在这个实验中我根本不需要声音(因此 -an

setpts 的作用是改变 Presentation TimeStamps。 PTS是一帧shown/drawn的时间。视频流的持续时间等于最后一帧的PTS + 最后一帧的持续时间。您的文件是 29.97 fps,因此每帧的持续时间为 0.033s。

在您的第一个命令中,第 2 帧的新 PTS 为 3.47 秒,但其持续时间仍为 0.033 秒,因此流的总持续时间为 3.5 秒

在你的两步过程中,第 2 帧的 PTS 为 6.97 秒。所以即使持续时间是7s,我认为这不是你想要的。

方法是

ffmpeg -i input.avi -filter:v "setpts=(7/2)*N/TB" -r 2/7 -an output.avi

其中 (7/2) 表示目标持续时间(7 秒)和总帧数 (2)。该分数在 -r 值中反转。 FFmpeg 根据 -r 值设置帧持续时间。