FFmpeg 完整指南
FFmpeg 是最强大的开源音视频处理工具,几乎所有媒体软件的底层都依赖它。
这页更适合作为“音视频处理任务手册”来用:先判断自己是在做转封装、转码、抽轨、压缩还是字幕处理,再选对应命令。FFmpeg 的难点通常不在命令多,而在于你是否清楚自己想保画质、保兼容性,还是优先缩体积。
先按任务选
最常见的需求可以先这样归类:
- 只是换容器格式:优先尝试
-c copy - 要缩体积或改编码:再做重新编码
- 只提取音频 / 字幕 / 缩略图:优先
-map、-vn、-an - 准备发网页或移动端:优先考虑 H.264 + AAC + MP4 的兼容组合
安装
# Scoop(推荐)
scoop install ffmpeg
# Winget
winget install Gyan.FFmpeg
# yt-dlp 团队维护的静态构建版
# https://github.com/yt-dlp/FFmpeg-Builds
验证:
ffmpeg -version
基础操作
格式转换
# 视频转码
ffmpeg -i input.mkv -c:v libx264 -crf 23 -c:a aac output.mp4
# 无损容器转换(不重新编码)
ffmpeg -i input.mkv -c copy output.mp4
# 音频转换
ffmpeg -i input.flac -c:a libmp3lame -q:a 0 output.mp3
ffmpeg -i input.wav -c:a libopus -b:a 128k output.opus
提取音视频
# 提取音频
ffmpeg -i video.mp4 -vn -c:a copy output.m4a
# 提取视频(去除音频)
ffmpeg -i video.mp4 -an -c:v copy output.mp4
# 提取指定音轨
ffmpeg -i video.mkv -map 0:a:1 -c:a copy second_audio.m4a
裁剪与拼接
# 裁剪(从 1:00 到 2:30)
ffmpeg -i input.mp4 -ss 00:01:00 -to 00:02:30 -c copy output.mp4
# 精确裁剪(重新编码)
ffmpeg -ss 00:01:00 -i input.mp4 -to 00:01:30 -c:v libx264 -c:a aac output.mp4
# 拼接(先创建文件列表)
# filelist.txt 内容:
# file 'part1.mp4'
# file 'part2.mp4'
ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
推荐处理流程
一个稳妥的处理顺序通常是:
- 先用
ffprobe看清源文件编码、分辨率、音轨、字幕轨 - 判断能否直接
-c copy,避免无意义重编码 - 必须转码时,再选择目标编码器与参数
- 输出后抽查时长、音画同步、字幕、移动端兼容性
如果你不先看源文件信息,就很容易出现“其实只需要换封装,却误做整段转码”的浪费。
视频编码
H.264(兼容性最好)
ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k output.mp4
CRF 值:0(无损)→ 23(默认)→ 51(最差),推荐 18-28。
H.265/HEVC(体积更小)
ffmpeg -i input.mkv -c:v libx265 -crf 28 -preset medium -c:a aac output.mp4
AV1(最新一代)
# SVT-AV1(速度较快)
ffmpeg -i input.mkv -c:v libsvtav1 -crf 30 -preset 6 -c:a libopus output.mkv
字幕处理
# 提取字幕
ffmpeg -i video.mkv -map 0:s:0 subtitle.srt
# 硬烧字幕(嵌入画面)
ffmpeg -i video.mp4 -vf "subtitles=sub.srt" output.mp4
# 软字幕(封装进容器)
ffmpeg -i video.mp4 -i sub.srt -c copy -c:s mov_text output.mp4
图片与 GIF
# 视频截图
ffmpeg -i video.mp4 -ss 00:00:30 -frames:v 1 screenshot.png
# 视频转 GIF
ffmpeg -i video.mp4 -vf "fps=15,scale=480:-1" -loop 0 output.gif
# 图片序列转视频
ffmpeg -framerate 30 -i frame_%04d.png -c:v libx264 -pix_fmt yuv420p output.mp4
音频处理
# 调整音量
ffmpeg -i input.mp3 -af "volume=1.5" output.mp3
# 音频标准化
ffmpeg -i input.mp3 -af loudnorm output.mp3
# 淡入淡出
ffmpeg -i input.mp3 -af "afade=t=in:d=3,afade=t=out:st=57:d=3" output.mp3
# 合并多个音频
ffmpeg -i "concat:01.mp3|02.mp3|03.mp3" -c copy output.mp3
质量与体积怎么取舍
一个简单的经验判断:
- 追求兼容:
libx264 + aac + mp4 - 追求更小体积:
libx265或libsvtav1 - 音频为主:优先
opus、aac - 网页播放:输出 MP4 时可加
-movflags +faststart
例如网页视频常见写法:
ffmpeg -i input.mkv -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 192k -movflags +faststart output.mp4
不要一味追求最低 CRF。体积、编码时间、播放设备兼容性往往要一起平衡。
实用技巧
查看文件信息
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
批量转换(PowerShell)
Get-ChildItem *.mkv | ForEach-Object {
ffmpeg -i $_.FullName -c:v libx264 -crf 23 -c:a aac "$($_.BaseName).mp4"
}
硬件加速
# NVIDIA GPU 加速编码
ffmpeg -i input.mkv -c:v h264_nvenc -preset p4 -crf 23 -c:a aac output.mp4
# Intel QSV
ffmpeg -i input.mkv -c:v h264_qsv -global_quality 23 -c:a aac output.mp4
常见问题
转完之后文件更大了
这通常说明:
- 原文件本身已经压得很紧
- 你用的目标参数比原片更高码率
- 进行了不必要的重编码
先用 ffprobe 看清原始编码参数,再决定是否真的需要转。
字幕报错或乱码
- 确认字幕文件编码是否为 UTF-8
- Windows 路径里有空格时,滤镜参数要注意引号
- 硬烧字幕走滤镜,软字幕走封装,二者不要混淆
音画不同步
优先确认源文件本身是否异常,再检查:
-ss放在输入前还是输入后- 拼接文件是否编码参数一致
- 是否混用了 VFR / CFR 素材
延伸阅读
参考链接
- FFmpeg 官网 — 文档与下载
- FFmpeg Wiki — 详细指南
- FFmpeg GitHub — 源码
- yt-dlp FFmpeg Builds — 静态构建版