第三章 命令行基础:FFmpeg命令结构解析、常用全局参数、输入文件参数、输出文件参数、帮助文档查看
说实话,我见过太多人一上来就背FFmpeg命令。背了忘,忘了查,查了又错。其实你只要搞懂它的命令结构,后面所有参数都是往这个骨架里填肉。这一章,我就带你把这个骨架拆明白。
核心认知:FFmpeg的命令行结构,本质上就是一个「输入 → 处理 → 输出」的管道模型。你给它什么文件,告诉它怎么处理,它就把结果吐出来。就这么简单。
3.1 命令结构:三要素模型
一条完整的FFmpeg命令,我习惯把它拆成三个部分:全局参数、输入参数、输出参数。你看这个模板:
ffmpeg [全局参数] [输入文件参数] -i 输入文件 [输出文件参数] 输出文件
嗯,这里要注意:-i 是输入文件的标志,它前面的参数作用于输入,它后面的参数作用于输出。我曾经见过有人把输出参数写在 -i 前面,结果FFmpeg根本不认,白白浪费半小时排查。
来,看个实际例子:
ffmpeg -y -hide_banner -i input.mp4 -c:v libx264 -b:v 2M output.mp4
这里面:
-y和-hide_banner是全局参数-i input.mp4是输入部分-c:v libx264 -b:v 2M是输出参数output.mp4是输出文件
为什么顺序这么重要?因为FFmpeg是从左到右解析参数的。你把输出参数放到输入前面,它可能被当成全局参数处理,或者干脆被忽略。我刚开始用的时候也踩过这个坑。
3.2 常用全局参数
全局参数,说白了就是影响整个命令行为的开关。它们不针对某个具体文件,而是控制FFmpeg「怎么干活」。我个人最常用的就这几个:
| 参数 | 作用 | 我的使用习惯 |
|---|---|---|
-y |
覆盖输出文件,不询问 | 脚本里必加,手动操作慎用 |
-n |
不覆盖输出文件,直接退出 | 批量处理时防止误覆盖 |
-hide_banner |
隐藏编译信息、库版本等 | 我每次都加,输出干净很多 |
-loglevel |
控制日志详细程度 | 调试用 debug,生产用 error |
-stats |
显示编码进度统计 | 默认开启,想静默就加 -nostats |
我的小技巧:写脚本时我习惯把 -y -hide_banner -loglevel error 这三个打包成一个变量 FFMPEG_GLOBAL="-y -hide_banner -loglevel error",每次调用直接引用,省得重复敲。
你可能会问:-loglevel 到底有哪些级别?我列个表给你:
| 级别 | 说明 | 什么时候用 |
|---|---|---|
quiet |
完全不输出 | 生产环境,只要结果不要日志 |
panic |
只输出致命错误 | 极少用,除非你确定不会出问题 |
fatal |
致命错误 | 同上 |
error |
只输出错误 | 我脚本里最常用 |
warning |
错误+警告 | 日常手动操作 |
info |
默认级别,信息较全 | 新手学习时推荐 |
verbose |
更详细的信息 | 排查编码参数问题时 |
debug |
所有调试信息 | 只有FFmpeg开发人员才需要 |
3.3 输入文件参数
输入参数,就是告诉FFmpeg「你要处理什么文件,以及这个文件有什么特性」。它们必须写在 -i 前面。我举个例子:
ffmpeg -ss 00:01:00 -t 30 -i input.mp4 output.mp4
这里 -ss 00:01:00 表示从第1分钟开始,-t 30 表示只处理30秒。这两个参数写在 -i 前面,FFmpeg会先跳转到指定位置,再开始读取,速度非常快。
⚠️ 注意:如果把 -ss 和 -t 写在 -i 后面(即输出参数位置),效果完全不一样——FFmpeg会先解码整个文件,再丢弃不需要的部分。速度慢很多,但关键帧定位更精确。我曾经在直播录制脚本里用错过,导致服务器CPU飙到100%。
常用的输入参数还有这些:
-re:以原始帧率读取输入,用于直播推流时模拟实时-f fmt:强制指定输入格式,比如-f image2读取图片序列-hwaccel:指定硬件加速方式,比如-hwaccel cuda-thread_queue_size:输入线程队列大小,直播流多路输入时很有用
3.4 输出文件参数
输出参数才是真正干活的地方。你想怎么编码、封装、滤镜,全在这里指定。我把它分成三类:
3.4.1 视频编码参数
-c:v libx264 # 视频编码器
-b:v 2M # 视频码率
-r 30 # 帧率
-s 1920x1080 # 分辨率
-preset medium # 编码预设(ultrafast ~ placebo)
-crf 23 # 质量因子(0-51,越小质量越好)
3.4.2 音频编码参数
-c:a aac # 音频编码器
-b:a 128k # 音频码率
-ar 44100 # 采样率
-ac 2 # 声道数
3.4.3 封装与映射参数
-map 0:v # 选择第一个输入的视频流
-map 0:a # 选择第一个输入的音频流
-f mp4 # 强制输出格式
-shortest # 以最短流为准结束编码
实战组合:一条完整的转码命令长这样:
ffmpeg -y -hide_banner -i input.mkv \
-c:v libx264 -preset slow -crf 21 \
-c:a aac -b:a 192k -ar 48000 \
-map 0:v -map 0:a \
output.mp4
这条命令把MKV转成MP4,视频用H.264慢速预设、CRF 21,音频用AAC 192kbps、48kHz采样率。我处理个人视频收藏时就用这套参数,画质和体积平衡得很好。
3.5 帮助文档查看:遇到问题不求人
说实话,没人能记住FFmpeg所有参数。我自己也经常查文档。关键是知道怎么查。我教你三招:
3.5.1 查看所有可用参数
ffmpeg -h # 基础帮助
ffmpeg -h long # 详细帮助
ffmpeg -h full # 完整帮助(内容非常多)
3.5.2 查看特定模块的帮助
ffmpeg -h encoder=h264_nvenc # 查看NVENC编码器参数
ffmpeg -h decoder=hevc # 查看HEVC解码器参数
ffmpeg -h muxer=mp4 # 查看MP4封装器参数
ffmpeg -h filter=yadif # 查看去隔行滤镜参数
3.5.3 查看支持的编码器/格式列表
ffmpeg -encoders # 所有编码器
ffmpeg -decoders # 所有解码器
ffmpeg -formats # 所有支持格式
ffmpeg -codecs # 所有编解码器
ffmpeg -filters # 所有滤镜
我的习惯:每次装完新版本的FFmpeg,我都会先跑一遍 ffmpeg -encoders | grep nvenc 看看硬件编码器有没有被编译进去。如果输出为空,说明这个版本没开硬件加速支持,得换一个编译版本。
你想想看,有了这三招,遇到不认识的参数,直接 -h 查一下,比上网搜快多了。而且查到的信息是最准确的,因为它是你当前这个FFmpeg版本的真实支持情况。
3.6 本章小结
这一章我们拆解了FFmpeg的命令结构:全局参数控制行为,输入参数告诉它读什么,输出参数告诉它怎么处理。记住那个三要素模型,你就能看懂90%的FFmpeg命令。遇到不懂的参数,用 -h 查,别硬背。