Back to blog

FFmpeg 命令实战:常用场景速查

按场景分类的 FFmpeg 命令——格式转换、裁剪、压缩、拼接、提取音频、截图、滤镜。

FFmpeg 命令基本结构:ffmpeg [全局参数] -i [输入] [输出参数] [输出文件]。输出参数必须写在输出文件名之前。大部分参数可用 ffmpeg -h encoder=libx264 查文档。

格式转换

#
# 容器转换(不重新编码)
ffmpeg -i input.mp4 -c copy output.mkv
ffmpeg -i input.mov -c copy output.mp4

# 编码转换(H.264 + AAC,最兼容)
ffmpeg -i input.mkv -c:v libx264 -c:a aac output.mp4

# HEVC(压缩率更高)
ffmpeg -i input.mp4 -c:v libx265 -c:a aac output_hevc.mp4

# 批量 mp4 → mkv
for f in *.mp4; do ffmpeg -i "$f" -c copy "${f%.mp4}.mkv"; done

裁剪

#
# 时间裁剪(关键帧快速定位)
ffmpeg -ss 00:00:30 -i input.mp4 -t 10 -c copy clip.mp4

# 精确到帧(重新编码)
ffmpeg -i input.mp4 -ss 00:00:30 -t 10 -c:v libx264 -c:a aac clip.mp4
# 画面裁切 crop=宽:高:起始x:起始y
ffmpeg -i input.mp4 -vf "crop=1280:720:200:100" output.mp4

# 缩放到 720p,保持宽高比
ffmpeg -i input.mp4 -vf "scale=-1:720" output_720p.mp4

# 缩放到 50%
ffmpeg -i input.mp4 -vf "scale=iw/2:ih/2" output_half.mp4

音频提取与替换

#
# 提取 MP3
ffmpeg -i input.mp4 -vn -c:a libmp3lame -b:a 192k output.mp3

# 提取 AAC
ffmpeg -i input.mp4 -vn -c:a aac -b:a 128k output.m4a

# 提取 WAV
ffmpeg -i input.mp4 -vn -c:a pcm_s16le output.wav

# 去掉音频
ffmpeg -i input.mp4 -an -c:v copy silent.mp4

# 替换音频轨
ffmpeg -i input.mp4 -i audio.mp3 -c:v copy -c:a aac -map 0:v:0 -map 1:a:0 -shortest output.mp4

压缩

#
# CRF 质量模式(0-51,越小越好,推荐 18-28)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -c:a aac output.mp4
ffmpeg -i input.mp4 -c:v libx265 -crf 28 -c:a aac output.mp4

# 固定码率
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -c:a aac -b:a 128k output.mp4

# 两遍编码(最大压缩率)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -preset slow -pass 1 -an -f null /dev/null
ffmpeg -i input.mp4 -c:v libx264 -b:v 1M -preset slow -pass 2 -c:a aac output.mp4

CRF 是首选,两遍编码只对固定码率有效。

拼接

#

同格式(编码参数一致)用 concat demuxer,无需重新编码:

# filelist.txt:
# file 'clip1.mp4'
# file 'clip2.mp4'

ffmpeg -f concat -safe 0 -i filelist.txt -c copy merged.mp4

不同格式先统一转码再拼。

截图

#
# 取单帧
ffmpeg -ss 00:01:00 -i input.mp4 -vframes 1 thumb.jpg

# 每隔 30 秒一张
ffmpeg -i input.mp4 -vf "fps=1/30" thumb_%03d.jpg

# 3x3 缩略图平铺
ffmpeg -i input.mp4 -vf "fps=1/30,tile=3x3" preview.jpg

# 查看媒体信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4

滤镜

#
# 文字水印
ffmpeg -i input.mp4 -vf "drawtext=text='DEMO':fontsize=36:fontcolor=red:x=w/2-text_w/2:y=h/2" output.mp4

# 图片水印(右上角)
ffmpeg -i video.mp4 -i logo.png -filter_complex \
  "[1:v]scale=iw*0.1:-1[logo];[0:v][logo]overlay=W-w-10:10" -c:a copy output.mp4

# 2 倍速
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4

# 慢动作 0.5x
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4

GPU 加速

#
# NVIDIA NVENC
ffmpeg -i input.mp4 -c:v h264_nvenc -preset p4 -b:v 5M output.mp4

# 列出可用硬件编码器
ffmpeg -encoders | grep -E "(nvenc|vaapi|qsv|videotoolbox)"

硬件编码快但同码率下画质略低,适合批量转码和直播。

常见坑

#
  • 参数顺序:输出参数(-b:v-c:v)必须写在输出文件名之前
  • 音频不同步-c copy 裁剪时,重新编码可解决
  • 覆盖确认-y 自动覆盖,-n 跳过已有
  • 快速测试-t 10 只处理前 10 秒

$ echo "collect what matters, write it down"