使用 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

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐