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 秒的关键帧开始了。
精确剪辑
需要精确到帧的剪辑,必须重新编码:
bashffmpeg -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 近乎无损)。
bashffmpeg -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 度。手机竖拍视频在电脑上横着显示时用这个修正。