使用 ffmpeg 截取视频的某一个时间段,可以结合以下3个选项:
-ss time_off 设置开始时间的偏移量
-to time_stop 记录或转码停止时间
-t duration 记录或转码音频视频的“持续时间”秒
使用 -ss 选项指定需要截取的开始时间,结合 -to 或者 -t。
官方还特意提醒了下,当-ss放在-i参数前,其搜索到的时间点位置是不准确的,ffmpeg只能检索到目标时间点之前最近的某个点。当-ss参数在-i参数之后,ffmpeg会将视频重新解码,然后丢弃目标起始时间点之前的视频,这样截取的视频起始时间点才是准确的
使用 -to 选项
to 指定结束的时间点,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,到 00:00:15.000 结束这一段视频。
ffmpeg -i input.mp4 -ss 00:00:05.000 -to 00:00:15.000 output.mp4
使用 -t 选项
t 指定持续时间,以下命令将截取视频文件 input.mp4 从 00:00:05.000 开始,持续 10 秒的一段视频。
ffmpeg -i input.mp4 -ss 00:00:05 -t -c copy 10 output.mp4
需要注意的是,使用 -c copy 时,剪切点(-ss 和 -to)会被调整到最近的关键帧,这可能会导致剪切不是特别精确。如果需要精确的剪切点,可能需要放弃使用 copy 模式。
如果你需要更精确的剪切:
# 精确剪切版本(会重新编码,但剪切更精确)
ffmpeg_cmd = f'ffmpeg -i "{video_file}" ' \
f'-ss {clip_meta.start_t} ' \
f'-to {clip_meta.end_t} ' \
f'-c:v libx264 ' \
f'-preset ultrafast ' \
f'-crf 0 ' \ # 无损质量
f'-c:a copy ' \ # 音频仍然可以直接复制
f'-y "{final_output_file}"'
参考:
https://www.cpming.top/p/using-ffmpeg-to-cut-up-video
https://www.cnblogs.com/xuejianbest/p/10285284.html