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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何准确延长微小视频片段的持续时间?相关的知识,希望对你有一定的参考价值。

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

答案

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值设置帧持续时间。

以上是关于如何准确延长微小视频片段的持续时间?的主要内容,如果未能解决你的问题,请参考以下文章

在 HTML5 Video 中,如何播放长视频中的小片段?

如何在片段中播放视频

1024. 视频拼接 dp

Leetcode.1024 视频拼接

如何在屏幕方向更改时附加片段?

如何使用两个片段实现视频和视频列表