在使用FFmpeg处理视频文件时,有多种方法可以扩展或重复视频的最后一帧。以下是一种常见的方法来实现这一点:
方法:使用 ffprobe
和 ffmpeg
步骤 1: 确定视频的总帧数和帧率
首先,我们需要使用 ffprobe
来获取视频的总帧数和帧率,以便知道最后一帧的时间码。
bashffprobe -v error -select_streams v:0 -count_frames -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mp4
这条命令会输出视频的总帧数。然后,获取视频的帧率:
bashffprobe -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
。
bashduration=$(echo "scale=2; N / F" | bc)
步骤 3: 使用 ffmpeg 重复最后一帧
接下来,使用 ffmpeg
来冻结视频的最后一帧。假设我们想要将最后一帧重复延长5秒。
bashffmpeg -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 回复