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)"
硬件编码快但同码率下画质略低,适合批量转码和直播。
字幕处理
## 烧录软字幕(依赖 libass,注意字体)
ffmpeg -i input.mp4 -vf "subtitles=sub.srt:force_style='FontName=Noto Sans SC,FontSize=20'" output.mp4
# 提取内嵌字幕轨(先看有哪些轨道)
ffprobe -i input.mkv -show_streams -select_streams s
# 提取为 srt(-c:s srt 转文本)
ffmpeg -i input.mkv -map 0:s:0 -c:s srt sub.srt
# 移除所有字幕轨
ffmpeg -i input.mkv -sn -c copy output.mkv
烧录硬字幕会重编码,源内嵌软字幕直接 -map 提取,不重编码。
元数据与封面
## 写标题/艺术家
ffmpeg -i input.mp3 -metadata title="曲名" -metadata artist="艺人" -c copy output.mp3
# 嵌入封面图(第一张图设为 attached_pic)
ffmpeg -i input.mp3 -i cover.jpg -map 0:a -map 1 -c copy -metadata:s:v title="Album cover" \
-metadata:s:v comment="Cover (front)" output.mp3
# 查看全部元数据
ffprobe -v quiet -show_entries format_tags input.mp4
GIF 与序列帧
## 视频转 GIF(调 palette 减少抖动,-r 降帧率控体积)
ffmpeg -i input.mp4 -vf "fps=12,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" out.gif
# 序列帧 -> 视频
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p video.mp4
# 视频 -> 序列帧
ffmpeg -i video.mp4 frame_%04d.png
常见坑
#- 参数顺序:输出参数(
-b:v、-c:v)必须写在输出文件名之前 - 音频不同步:
-c copy裁剪时,重新编码可解决 - 覆盖确认:
-y自动覆盖,-n跳过已有 - 快速测试:
-t 10只处理前 10 秒