第三章 命令行基础: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是从左到右解析参数的。你把输出参数放到输入前面,它可能被当成全局参数处理,或者干脆被忽略。我刚开始用的时候也踩过这个坑。

FFmpeg 命令结构三要素模型 全局参数 -y / -hide_banner / -loglevel 输入文件参数 -i input.mp4 输出文件参数 -c:v libx264 -b:v 2M output.mp4 💡 解析顺序:从左到右 全局参数 → 输入参数(-i前) → 输入文件(-i) → 输出参数(-i后) → 输出文件

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 查,别硬背。