6月2日 00:00

FFmpeg 视频剪辑、合并和截图怎么做?常用命令速查

视频剪辑、合并、截图是 FFmpeg 最高频的日常操作。核心命令不多,但参数位置有讲究——放错位置效果完全不同。

视频剪辑:截取片段

最常用的剪辑命令

bash
# 从第 10 秒开始,截取 30 秒 ffmpeg -ss 00:00:10 -i input.mp4 -t 30 -c copy output.mp4 # 从 1:30 截到 3:00 ffmpeg -ss 00:01:30 -to 00:03:00 -i input.mp4 -c copy output.mp4

-c copy 直接拷贝音视频流,不重新编码,速度极快(几秒搞定),但切割点可能不精确——因为视频是按关键帧压缩的,-c copy 只能在关键帧处切开。结果可能是你想从 10 秒切,实际从 8 秒的关键帧开始了。

精确剪辑

需要精确到帧的剪辑,必须重新编码:

bash
ffmpeg -i input.mp4 -ss 00:00:10 -t 30 -c:v libx264 -crf 23 -c:a aac output.mp4

去掉 -c copy,让 FFmpeg 重新编码。速度慢很多但切割点精确。

-ss 放在 -i 前面还是后面?

  • -ss-i 前面:FFmpeg 先跳到指定时间再开始解码(seek 模式),速度快但可能不精确
  • -ss-i 后面:FFmpeg 从头解码到指定时间,精确但慢

最佳实践:先放前面快速定位,再精确微调。对于长视频(>10 分钟),放前面能省很多时间。

视频合并:拼接多个片段

concat 协议(最快,要求格式完全一致)

bash
# 先创建文件列表 echo "file 'part1.mp4'" > list.txt echo "file 'part2.mp4'" >> list.txt echo "file 'part3.mp4'" >> list.txt # 合并 ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

-c copy 不重编码,秒级完成。但要求所有片段的编码参数(分辨率、帧率、编码器)完全一致,否则合并后可能花屏或播放异常。

格式不一致时:先统一再合并

bash
# 先把所有片段转成统一格式 for f in part*.mp4; do ffmpeg -i "$f" -c:v libx264 -crf 23 -c:a aac -b:a 128k -vf "scale=1920:1080" -r 30 "normalized_$f" done # 再用 concat 合并 echo "file 'normalized_part1.mp4'" > list.txt echo "file 'normalized_part2.mp4'" >> list.txt ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

filter 复杂合并(加转场等效果)

bash
# 两个视频左右并排 ffmpeg -i left.mp4 -i right.mp4 -filter_complex "[0:v][1:v]hstack=inputs=2" output.mp4 # 上下并排 ffmpeg -i top.mp4 -i bottom.mp4 -filter_complex "[0:v][1:v]vstack=inputs=2" output.mp4

filter 合并必须重编码,速度慢但能做各种效果。

视频截图

bash
# 截取第 5 秒的一帧 ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 screenshot.jpg # 每隔 10 秒截一张 ffmpeg -i input.mp4 -vf "fps=1/10" screenshot_%04d.jpg # 截取多张(前 60 秒,每秒 1 帧) ffmpeg -i input.mp4 -t 60 -vf "fps=1" frame_%04d.jpg

fps=1/10 表示每 10 秒一帧。%04d 是序号占位符,生成 screenshot_0001.jpg、screenshot_0002.jpg...

截图的质量参数:-q:v 2(1 最好,31 最差,2 近乎无损)。

bash
ffmpeg -i input.mp4 -ss 00:00:05 -vframes 1 -q:v 2 screenshot.jpg

实用技巧

去除视频静音段:用 silenceremove 滤镜自动剪掉没有声音的部分,适合处理会议录像。

加速/减速视频-vf "setpts=0.5*PTS" 2 倍速,-vf "setpts=2*PTS" 半速。音频也要对应调整:-af "atempo=2.0"(atempo 范围 0.5-2.0,超出需要串联)。

旋转视频-vf "transpose=1" 顺时针 90 度。手机竖拍视频在电脑上横着显示时用这个修正。

标签:FFmpeg