🎬 第三章 FFmpeg三大常用工具及应用选项详解
📄 一句话概括

-colors 打的是「名字加一组十六进制分量」。 它的用处不是「看有哪些颜色」,是「确认这个名字存不存在」。

📝 本节和前面几节的关系

3.11.9、3.11.10 讲音频的两个属性,这一节转到视频侧的颜色。 颜色名在滤镜链里到处都是,写错一个就是整条命令失败。

一、每行读作「名字 = 十六进制」

清单的每一行形如 red = 0xFF0000,右边那六个十六进制位就是 RGB:

名字 R G B 常见用法


black 0 0 0 清单的第一行 white 255 255 255 等于 0xFFFFFF red 255 0 0 做标记最显眼 green 0 128 0 不是纯绿,偏暗 blue 0 0 255 纯蓝 yellow 255 255 0 字幕描边常用

green 这一行值得单独看一眼:标准里它是 0x008000(深绿), 而 0x00FF00 那个名字叫 lime。想写「纯绿」,写 green 会明显偏暗。

这类反直觉的名字不止一个:gray 是 128 那档中灰,不是 50% 的 127。 所以颜色这种参数,别凭感觉写,查一下十六进制最省事。

二、同一种颜色三种写法

名字只是三种写法里的一种,另外两种更通用:

写法 例子 什么时候用


名字 color=red 手写调试,一眼看懂 0xRRGGBB color=0xFF0000 脚本生成,不用记名字 0xRRGGBBAA color=0xFF000080 要半透明时

第三行末尾那两位是 alpha:80 约等于一半,00 全透明,FF 不透明。 不写那两位就是完全不透明,不会因为「少了两位」而报错。

脚本里更推荐用十六进制:不受大小写、拼写、别名的影响。 名字适合给人看的命令,十六进制适合机器生成的命令。

三、沙箱能验到哪一层

这一节的能力边界要说清楚,不能假装测过:

想验什么 靠什么 沙箱里能验吗


这份构建有哪些名字 ffmpeg -colors 不能,要真 exe 某个名字是什么 RGB 查同名的标准色表 能 某个名字认不认 真跑一条 color= 不能,要真 exe

第二行能验,是因为 ffmpeg 那张色表本就照 X11/CSS 的名字抄的。 aliceblue 这种冷门名字都能对上,说明两边同源。

但「同源」不等于「逐个都一致」——个别名字在两边可能有细微差别。 所以真要用冷门颜色,还是以 -colors 打出来的十六进制为准。

四、动手 Demo:名字、十六进制、透明度三套写法

取了七个最有代表性的名字,把它们对应的 RGB 读出来摆成表。 重点看 green 那一行——它跟大多数人的直觉不一样。 沙箱里没有 ffmpeg,这一步用的是同名标准色表,同源关系在正文里说明。

import av
from PIL import ImageColor

COLORS = [u"black", u"white", u"red", u"green",
          u"blue", u"yellow", u"aliceblue"]
for name in COLORS:
    r, g, b = ImageColor.getrgb(name)
    print(u"%-10s 0x%02X%02X%02X  %3d %3d %3d" % (name, r, g, b, r, g, b))

# 透明度:末尾两位是 alpha
for a in (0xFF, 0x80, 0x00):
    print(u"0xFF0000%02X  不透明度约 %d%%" % (a, round(a / 255.0 * 100)))

实跑输出:

--------------------------------------------------------------------
3.11.11 -colors——名字、十六进制、透明度三套写法
--------------------------------------------------------------------

**① `-colors` 打的是「名字 + 一组十六进制分量」**

**每行形如 `red = 0xFF0000`,左边是能在 `color=` 里直接写的名字,右边是等价的十六进制。**
**所以这张表真正的作用不是「看有哪些颜色」,而是「确认这个名字存不存在」。**

**② 几个最常见的名字,连同它的 RGB**

  名字          R       G       B       常见用法
  ---------------------------------------------------------------
  black         0       0       0       -colors 表的第一行
  white         255     255     255     最常用,等于 0xFFFFFF
  red           255     0       0       纯红,做标记最显眼
  green         0       128     0       注意不是 0x00FF00
  blue          0       0       255     纯蓝
  yellow        255     255     0       字幕描边常用
  aliceblue     240     248     255     冷门名,证明表很大

**`green` 这一行值得单独看一眼:标准里 `green` 是 0x008000(深绿),**
**而 0x00FF00 那个名字叫 `lime`。想在画面里写「纯绿」,写 `green` 会偏暗。**

**③ 同一种颜色有三种写法,效果完全一样**

  写法           例子                 什么时候用
  ------------------------------------------------------------
  名字           color=red            手写调试,一眼看懂
  0xRRGGBB       color=0xFF0000       脚本生成,不用记名字
  0xRRGGBBAA     color=0xFF000080     要半透明时

**第三行末尾那两位是 alpha:`80` 约等于一半,`00` 全透明,`FF` 不透明。**
**不写那两位就是完全不透明,不会因为「少了两位」而报错。**

**④ 沙箱能验到哪一层**

  想验什么                   靠什么               沙箱里能验吗
  ------------------------------------------------------------------
  这份构建有哪些颜色名       ffmpeg -colors       不能,要真 exe
  某个名字是什么 RGB         查同名的标准色表     能
  某个名字 ffmpeg 认不认     真跑一条 color=      不能,要真 exe

**第二行能验,是因为 ffmpeg 那张色表本来就是照 X11/CSS 的名字抄的,**
**`aliceblue` 这种冷门名字都能对上,说明两边同源。**
**但「同源」不等于「逐个都一致」——个别名字在两边可能有细微差别,**
**所以真要用某个冷门颜色,还是以 `-colors` 打出来的十六进制为准。**

green 打出来是 0x008000,不是 0xFF0000 那种纯色——它本身就是深绿。 想要 0x00FF00 得写 lime,这个名字很多人不知道。

下面那三行演示 alpha:FF 是 255 即完全不透明,80 约一半,00 全透明。 所以 0xRRGGBBAA 那八位的最后两位,作用就是一个「浓淡旋钮」。

这一步验的是「名字对应的 RGB」,不是「ffmpeg 认不认这个名字」。 两件事的边界要分清:前者是标准色表的事,后者要真 exe 才答得了。

30 秒实验

  1. 列颜色:ffmpeg -colors,每行左边是名字、右边是十六进制。
  2. 用名字:ffmpeg -f lavfi -i color=red:s=320x240 -frames:v 1 出.png。
  3. 用半透明:ffmpeg -f lavfi -i color=0xFF000080:s=320x240 -frames:v 1 出.png。

常见误区

  1. 以为 green 是纯绿。它是 0x008000 深绿,纯绿那个名字叫 lime。
  2. 以为不写 alpha 会默认透明。不写那两位就是完全不透明。
  3. 以为颜色名在所有构建上都一样。清单随构建变,冷门名字要用 -colors 确认。
自测三问(点开对答案) 1. `green` 对应的十六进制是多少?纯绿又该写什么名字? —— `green` 是 0x008000,属于深绿;纯绿 0x00FF00 的名字是 `lime`。 2. `0xRRGGBBAA` 里最后两位管什么? —— 管透明度(alpha):FF 完全不透明、80 约一半、00 全透明。 3. 为什么脚本里更推荐写十六进制而不是颜色名? —— 十六进制不受拼写、大小写、别名影响,机器生成的命令用它最稳。

相关笔记