FFmpeg
文档目录通用语法

通用语法

本页以官方 ffmpeg-utils 手册(libavutil 提供的通用特性与工具)为主,汇总 ffmpeg、ffplay、ffprobe 所有工具共用的语法与格式约定;选项语法与流说明符取自 ffmpeg 手册 的通用章节。

选项语法

除非另有说明,所有数值选项都接受一个数字字符串,其后可以跟 SI 单位前缀(如 KMG)。前缀后追加 i 按二进制倍数解释(1024 的幂而非 1000 的幂);追加 B 把数值乘以 8。因此 KBMiBGB 都可用作数值后缀。

不带参数的选项是布尔选项,出现即置真;在选项名前加 no 即置假,例如 -nofoo 把名为 foo 的布尔选项设为 false。

接受参数的选项还支持特殊语法:命令行给出的参数被当作文件路径,实际取值从该文件加载。方法是在前导短横线之后、选项名之前加一个正斜杠 /

ffmpeg -i INPUT -/filter:v filter.script OUTPUT

这会从名为 filter.script 的文件加载滤镜图描述。

AVOptions

另一类选项由 libavformat、libavdevice、libavcodec 库直接提供,用 -help 可列出,分两类:generic(通用)可对任何容器、编解码器或设备设置(容器/设备类列在 AVFormatContext options 下,编解码器类列在 AVCodecContext options 下);private(私有)特定于某个容器、设备或编解码器。例如向 MP3 写入 ID3v2.3 头而非默认的 ID3v2.4,使用 MP3 混流器的私有选项 id3v2_version

ffmpeg -i input.flac -id3v2_version 3 out.mp3

流说明符

有些选项按流生效(如码率、编解码器),流说明符(stream specifier)用于精确指定选项作用于哪个(些)流。它一般是在选项名后加冒号再接一串字符,例如 -codec:a:1 ac3 中的 a:1 匹配第二个音频流,为其选择 ac3 编解码器。一个说明符可匹配多个流,选项应用于所有匹配流,例如 -b:a 128k 中的 :a 匹配全部音频流。空说明符匹配所有流:-codec copy-codec: copy 复制所有流而不重新编码。合法形式:

  • stream_index:按流索引匹配,如 -threads:1 4 把第二个流的线程数设为 4。作附加说明符时从已匹配流中选该编号的流。编号默认按 libavformat 探测顺序,指定流组/节目时按组/节目内顺序。
  • stream_type[:additional_stream_specifier]:类型取 v/V(视频)、a(音频)、s(字幕)、d(数据)、t(附件)。v 匹配所有视频流,V 排除封面图/缩略图类视频流;带附加说明符时匹配两者同时满足的流。
  • g:group_specifier[:additional_stream_specifier]:匹配属于某流组的流,组说明符可为组索引或 #group_id / i:group_id
  • p:program_id[:additional_stream_specifier]:匹配属于指定节目(program)的流。
  • #stream_idi:stream_id:按流 ID 匹配(如 MPEG-TS 中的 PID)。
  • m:key[:value]:匹配带元数据标签 key(值为 value;省略则任意值)的流,key/value 中的冒号需反斜杠转义。
  • disp:dispositions[:additional_stream_specifier]:匹配具有给定 disposition 的流,多个用 + 连接。
  • u:匹配配置可用的流:编解码器已定义且视频尺寸、音频采样率等必要信息齐备。

注意:在 ffmpeg 中,按元数据匹配只对输入文件能正常工作。

引用与转义

除非显式另有说明,FFmpeg 采用如下引用与转义机制:

  • '\ 是特殊字符(分别用于引用和转义)。根据所处语法,可能还有其他特殊字符。
  • 特殊字符前加 \ 即被转义。
  • 一对 ' 之间的所有字符按字面量纳入被解析字符串。引号 ' 本身无法被引用,需先闭合引号再转义它。
  • 首尾空白除非转义或被引用,否则从解析结果中去掉。

在命令行或脚本中使用时,你可能需要按 shell 语法做第二层转义。av_get_tokenlibavutil/avstring.h)可按上述规则解析记号;源码树的 tools/ffescape 可在脚本中自动转义字符串。

转义含 ' 的字符串 Crime d'Amour

Crime d\'Amour

字符串含引号时,引用它需转义该引号:

'Crime d'\''Amour'

用引用保留首尾空白:

'  this string starts and ends with whitespaces  '

转义与引用可混用:

' The string '\'string\'' is a string '

字面量 \ 转义或引用皆可:'c:\foo' 可写成 c:\\foo

日期

接受的语法:

[(YYYY-MM-DD|YYYYMMDD)[T|t| ]]((HH:MM:SS[.m...]]])|(HHMMSS[.m...]]]))[Z]
now

值为 now 时取当前时间。时间为本地时间,追加 Z 按 UTC 解释;未给出年月日时取当前年月日。

时间时长

两种语法。[-][HH:]MM:SS[.m...]HH 为小时,MM 分钟(最多 2 位),SS 秒(最多 2 位),末尾 mSS 的小数部分。或 [-]S+[.m...][s|ms|us]S 为秒数,可带小数部分;可选后缀 smsus 分别按秒、毫秒、微秒解释。可选的 - 表示负时长。

以下都是合法时间时长:

写法含义写法含义
5555 秒0.20.2 秒
200ms200 毫秒,即 0.2s200000us200000 微秒,即 0.2s
12:03:4512 小时 03 分 45 秒23.18923.189 秒

视频尺寸

宽x高 形式的字符串,或下列尺寸缩写之一(此处节选常用项,完整缩写表见官方手册)。

缩写尺寸缩写尺寸缩写尺寸
ntsc720x480pal720x576film352x240
cif352x2884cif704x57616cif1408x1152
qvga320x240vga640x480svga800x600
xga1024x768wxga1366x768wuxga1920x1200
hd480852x480hd7201280x720hd10801920x1080
2k2048x10804k4096x2160uhd21603840x2160
uhd43207680x4320qcif176x144

视频帧率

每秒生成帧数,写作 frame_rate_num/frame_rate_den 字符串、整数、浮点数或下列缩写之一。

缩写帧率缩写帧率
ntsc30000/1001pal25/1
qntsc30000/1001qpal25/1
sntsc30000/1001spal25/1
film24/1ntsc-film24000/1001

比率

比率可写成表达式,或 分子:分母 形式。无穷大(1/0)或负值比率也视为合法,如需排除必须自行检查返回值。未定义值用字符串 0:0 表示。

颜色

颜色可以是下列颜色名之一(不区分大小写),或 [0x|#]RRGGBB[AA] 序列,其后还可跟 @ 加 alpha 分量。alpha 可为 0x 加十六进制数或 0.0 到 1.0 的十进制数,表示不透明度(0x00/0.0 全透明,0xff/1.0 完全不透明),未指定按 0xffrandom 产生随机颜色。

常用色名节选,完整列表见官方手册

名称名称名称
Black0x000000White0xFFFFFFRed0xFF0000
Green0x008000Blue0x0000FFYellow0xFFFF00
Cyan0x00FFFFAqua0x00FFFFMagenta0xFF00FF
Gray0x808080Silver0xC0C0C0Orange0xFFA500
Purple0x800080Lime0x00FF00Navy0x000080

Channel Layout(声道布局)

声道布局描述多声道音频流中各声道的空间位置,FFmpeg 为此使用一套特殊语法。单个声道由下列 ID 标识:

ID含义ID含义ID含义
FL左前FR右前FC中置
LFE低频BL左后BR右后
FLC左前偏中FRC右前偏中BC后中置
SL左侧SR右侧TC顶中置
TFL左前上TFC前中上TFR右前上
TBL左后上TBC后中上TBR右后上
DL降混左DR降混右WL左宽
WR右宽SDL左环绕直入SDR右环绕直入
LFE2低频 2

标准布局标识符:

布局组成布局组成
monoFCstereoFL+FR
2.1FL+FR+LFE3.0FL+FR+FC
3.0(back)FL+FR+BC4.0FL+FR+FC+BC
quadFL+FR+BL+BRquad(side)FL+FR+SL+SR
3.1FL+FR+FC+LFE5.0FL+FR+FC+BL+BR
5.0(side)FL+FR+FC+SL+SR4.1FL+FR+FC+LFE+BC
5.1FL+FR+FC+LFE+BL+BR5.1(side)FL+FR+FC+LFE+SL+SR
6.0FL+FR+FC+BC+SL+SR6.0(front)FL+FR+FLC+FRC+SL+SR
3.1.2FL+FR+FC+LFE+TFL+TFRhexagonalFL+FR+FC+BL+BR+BC
6.1FL+FR+FC+LFE+BC+SL+SR6.1FL+FR+FC+LFE+BL+BR+BC
6.1(front)FL+FR+LFE+FLC+FRC+SL+SR7.0FL+FR+FC+BL+BR+SL+SR
7.0(front)FL+FR+FC+FLC+FRC+SL+SR7.1FL+FR+FC+LFE+BL+BR+SL+SR
7.1(wide)FL+FR+FC+LFE+BL+BR+FLC+FRC7.1(wide-side)FL+FR+FC+LFE+FLC+FRC+SL+SR
5.1.2FL+FR+FC+LFE+BL+BR+TFL+TFRoctagonalFL+FR+FC+BL+BR+BC+SL+SR
cubeFL+FR+BL+BR+TFL+TFR+TBL+TBR5.1.4FL+FR+FC+LFE+BL+BR+TFL+TFR+TBL+TBR
7.1.2FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR7.1.4FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR+TBL+TBR
7.2.3FL+FR+FC+LFE+BL+BR+SL+SR+TFL+TFR+TBC+LFE29.1.4FL+FR+FC+LFE+BL+BR+FLC+FRC+SL+SR+TFL+TFR+TBL+TBR
9.1.6FL+FR+FC+LFE+BL+BR+FLC+FRC+SL+SR+TFL+TFR+TBL+TBR+TSL+TSRhexadecagonalFL+FR+FC+BL+BR+BC+SL+SR+WL+WR+TBL+TBR+TBC+TFC+TFL+TFR
binauralBIL+BIRdownmixDL+DR
22.2FL+FR+FC+LFE+BL+BR+FLC+FRC+BC+SL+SR+TC+TFL+TFC+TFR+TBL+TBC+TBR+LFE2+TSL+TSR+BFC+BFL+BFR

自定义布局写成以 + 分隔的项序列,每项是单个声道名(如 FLFRFCLFE),可在 @ 后附加自定义名(如 FL@LeftLFE@Low_Frequency)。标准布局可由下列任一形式指定:

  • 单个声道名,或标准布局名(monostereo4.0quad5.0 等);
  • 十进制声道数后跟 c,取该声道数的默认布局(见 av_channel_layout_default;并非所有声道数都有默认布局);
  • 十进制声道数后跟 C,得指定声道数的未知布局(并非所有布局字符串都支持未知布局);
  • 0x 开头的十六进制布局掩码(见 libavutil/channel_layout.hAV_CH_* 宏)。

libavutil 53 版之前末尾 c 可省略,现在必需;布局掩码也可直接写十进制数(当且仅当后不跟 c/C)。

表达式求值

求值算术表达式时,FFmpeg 使用经 libavutil/eval.h 接口实现的内置公式求值器。表达式可含一元、二元运算符、常量与函数。expr1;expr2 依次求值两者,值为 expr2。二元运算符:+-*/^;一元运算符:+-。内部变量经 ld/st 存取(索引 0 到 9)。

可用函数(未注明者均对参数 xexpr 求值):

  • abs(x) 绝对值;sgn(x) 符号;min/max 最小/最大值;mod(x, y) 除余数。
  • acos(x)/asin(x)/atan(x) 反三角函数;atan2(y, x)y/x 反正切主值;cos/cosh/sin/sinh/tan/tanh 三角与双曲函数。
  • between(x, min, max)x 不小于 min 且不大于 max 时返回 1,否则 0。gt/gte/lt/lte 大于、大于等于、小于、小于等于;eq(x, y) 相等返回 1;not(expr) 为零返回 1.0;isinf(x)/isnan(x) 无穷大/NaN 判断。
  • bitand(x, y)/bitor(x, y):按位与/或,结果先转整数再运算,转换可能丢精度,大数(通常 2^53 及以上)注意意外结果。
  • ceil(expr) 向上取整(ceil(1.5)2.0);floor(expr) 向下取整(floor(-1.5)-2.0);round(expr) 四舍五入(round(1.5)2.0);trunc(expr) 向零取整(trunc(-1.5)-1.0)。
  • clip(x, min, max):返回裁剪到 [min, max]xlerp(x, y, z):按 zxy 线性插值。
  • exp(x) 以欧拉数 e 为底的指数;log(x) 自然对数;pow(x, y)(x)^(y)sqrt(expr)(expr)^.5hypot(x, y) 同 C 同名函数,返回 sqrt(x*x + y*y)
  • gauss(x)exp(-x*x/2) / sqrt(2*PI)squish(x)1/(1 + exp(4*x))gcd(x, y) 最大公约数(两者均 0 或任一为负时行为未定义)。
  • if(x, y)x 非零返回 y 的值,否则 0;if(x, y, z):非零返回 y 否则 zifnot(x, y)/ifnot(x, y, z) 反之(x 为零时取 y)。
  • print(t)/print(t, l):按日志级别 l 打印 t 的值并返回该值。
  • random(idx)/randomi(idx, min, max):伪随机值(分别位于 0.0 到 1.0、[min, max] 区间),idx 为存种子/状态的内部变量,先用 st(idx) 存入 64 位无符号种子。例:st(0,42); print(random(0)); print(random(0)); print(random(0))
  • root(expr, max):在 0..max 内求使 expr(以 ld(0) 为自变量)为 0 的输入值,expr 须连续。
  • taylor(expr, x)/taylor(expr, x, idx):以表示 ld(idx) 阶导数的表达式在 x 处求泰勒级数,不收敛时未定义,idx 缺省 0;导数在 y 点时用 taylor(expr, x-y)
  • time(0):当前墙钟秒数。while(cond, expr)cond 非零期间反复求值 expr 并返回最后一次结果,cond 始终为假则返回 NAN。
  • ld(idx) 读、st(idx, expr) 写内部变量(st 返回被存的值;目前变量不跨表达式共享)。

常量:PI 约 3.14;Eexp(1),约 2.718;PHI 黄金分割率 (1+sqrt(5))/2,约 1.618。

约定"值非零即为真"时,* 相当于 AND,+ 相当于 OR,例如 if (A AND B) then C 等价于 if(A*B, C)。在 C 代码中可扩展一元、二元函数列表并注册常量。求值器认识 SI 前缀:追加 i 按 2 的幂解释;后缀 B 乘 8,可跟在单位前缀后或单独使用(如 KBMiBGB):

前缀前缀前缀
y10^-24 / 2^-80z10^-21 / 2^-70a10^-18 / 2^-60
f10^-15 / 2^-50p10^-12 / 2^-40n10^-9 / 2^-30
u10^-6 / 2^-20m10^-3 / 2^-10c10^-2
d10^-1h10^2k10^3 / 2^10
K10^3 / 2^10M10^6 / 2^20G10^9 / 2^30
T10^12 / 2^40P10^15 / 2^50E10^18 / 2^60
Z10^21 / 2^70Y10^24 / 2^80

参见

ffmpegffplayffprobe、libavutil

作者

FFmpeg 开发者(The FFmpeg developers)。作者详情见项目 Git 历史(https://git.ffmpeg.org/ffmpeg,如执行 git log);各组件维护者列在源码树 MAINTAINERS 文件中。