我注意到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
)
答案 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
值设置帧持续时间。