乐闻世界logo
搜索文章和话题

如何使用 ffmpeg 重复视频中的最后一帧

4 个月前提问
4 个月前修改
浏览次数42

1个答案

1

在使用FFmpeg处理视频文件时,有多种方法可以扩展或重复视频的最后一帧。以下是一种常见的方法来实现这一点:

方法:使用 ffprobeffmpeg

步骤 1: 确定视频的总帧数和帧率

首先,我们需要使用 ffprobe 来获取视频的总帧数和帧率,以便知道最后一帧的时间码。

bash
ffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4

这条命令会输出视频的总帧数。然后,获取视频的帧率:

bash
ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=nokey=1:noprint_wrappers=1 input.mp4

这条命令会输出类似 25/1 的帧率,表示每秒25帧。

步骤 2: 计算视频的持续时间

有了帧率和总帧数,可以计算视频的持续时间。设总帧数为 N,帧率为 F

bash
duration=$(echo "scale=2; N / F" | bc)

步骤 3: 使用 ffmpeg 重复最后一帧

接下来,使用 ffmpeg 来冻结视频的最后一帧。假设我们想要将最后一帧重复延长5秒。

bash
ffmpeg -i input.mp4 -filter_complex "[0:v]trim=duration=$duration,setpts=PTS-STARTPTS[v0];[0:v]trim=start=$duration,setpts=PTS-STARTPTS[v1];[v1]tpad=stop_mode=clone:stop_duration=5[v2];[v0][v2]concat[v]" -map "[v]" -c:v libx264 -preset fast -crf 22 -c:a copy output.mp4

这条命令执行了以下操作:

  • [0:v]trim=duration=$duration,setpts=PTS-STARTPTS[v0]:获取视频直到最后一帧之前的部分。
  • [0:v]trim=start=$duration,setpts=PTS-STARTPTS[v1]:获取视频的最后一帧。
  • [v1]tpad=stop_mode=clone:stop_duration=5[v2]:将最后一帧重复5秒。
  • [v0][v2]concat[v]:将视频的前半部分与重复的最后一帧连接起来。

示例

假设有一个视频 input.mp4,帧率是25fps,总帧数是1000帧。按照上述方法,我们可以计算出视频的持续时间是40秒(1000/25),然后使用 ffmpeg 来重复最后一帧5秒。

这种方法适用于各种长度和格式的视频,可以根据需要调整重复时间和其他参数。

2024年8月14日 23:48 回复

你的答案