如何准确延长微小视频片段的持续时间?

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

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

video ffmpeg video-processing pts
1个回答
1
投票

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

在你的第一个命令中,第二帧获得了3.47秒的新PTS但其持续时间仍为0.033秒,因此该流的总持续时间为3.5秒

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

这样做的方法是

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

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

© www.soinside.com 2019 - 2024. All rights reserved.