5月27日 23:08

如何用FFmpeg剪切视频片段?

核心命令:

bash
ffmpeg -ss 10 -to 30 -i input.mp4 -c copy output.mp4

-ss 10 指定起始时间为第 10 秒,-to 30 指定结束时间为第 30 秒,-c copy 直接复制音视频流不做重新编码,速度极快且质量无损。

也可以用 -t 指定持续时长:

bash
ffmpeg -ss 10 -t 20 -i input.mp4 -c copy output.mp4

-t 20 表示从起始位置持续 20 秒,效果与 -to 30 等价。

-ss 放在 -i 前后的区别

-ss 放在 -i 前面(输入选项):FFmpeg 先 seek 到目标时间点再读取,速度快,但可能定位到最近的关键帧,精度不够。

-ss 放在 -i 后面(输出选项):FFmpeg 从头解码到目标时间点,精度高,但速度慢。

生产环境推荐折中方案——先粗定位再精定位:

bash
ffmpeg -ss 10 -i input.mp4 -ss 0 -to 20 -c copy output.mp4

第一个 -ss 10 快速跳到第 10 秒附近,第二个 -ss 0 -to 20 从该位置精确截取 20 秒。

剪切后黑屏或音画不同步

-c copy 按关键帧切割,如果起始时间不在关键帧上,开头可能出现黑屏。解决方案:

  • 允许重新编码,用 -c:v libx264 -c:a aac 替换 -c copy,精度最高但有质量损失
  • -avoid_negative_ts make_zero 修复时间戳偏移
  • 音画不同步时加 -async 1 自动修正音频时间戳
bash
ffmpeg -ss 10 -to 30 -i input.mp4 -c:v libx264 -c:a aac -avoid_negative_ts make_zero output.mp4

用 trim 过滤器精确剪切

适合需要对剪切结果做进一步处理的场景:

bash
ffmpeg -i input.mp4 -vf trim=10:30,setpts=PTS-STARTPTS -af atrim=10:30,asetpts=PTS-STARTPTS output.mp4

trimatrim 分别处理视频轨和音频轨,setpts=PTS-STARTPTS 重置时间戳保证从零开始播放。此方式会触发重新编码,适合短片段处理。

验证剪切结果

bash
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 output.mp4

输出 duration=20.000000 表示时长为 20 秒,符合预期。

标签:FFmpeg