5月27日 23:08
如何用FFmpeg剪切视频片段?
核心命令:
bashffmpeg -ss 10 -to 30 -i input.mp4 -c copy output.mp4
-ss 10 指定起始时间为第 10 秒,-to 30 指定结束时间为第 30 秒,-c copy 直接复制音视频流不做重新编码,速度极快且质量无损。
也可以用 -t 指定持续时长:
bashffmpeg -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 从头解码到目标时间点,精度高,但速度慢。
生产环境推荐折中方案——先粗定位再精定位:
bashffmpeg -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自动修正音频时间戳
bashffmpeg -ss 10 -to 30 -i input.mp4 -c:v libx264 -c:a aac -avoid_negative_ts make_zero output.mp4
用 trim 过滤器精确剪切
适合需要对剪切结果做进一步处理的场景:
bashffmpeg -i input.mp4 -vf trim=10:30,setpts=PTS-STARTPTS -af atrim=10:30,asetpts=PTS-STARTPTS output.mp4
trim 和 atrim 分别处理视频轨和音频轨,setpts=PTS-STARTPTS 重置时间戳保证从零开始播放。此方式会触发重新编码,适合短片段处理。
验证剪切结果
bashffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1 output.mp4
输出 duration=20.000000 表示时长为 20 秒,符合预期。