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

时间:2018-04-18 02:03:16

标签: video ffmpeg video-processing pts

我注意到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

1 个答案:

答案 0 :(得分:1)

setpts所做的是改变 P 怨恨 T ime S 篡改。 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值设置帧持续时间。