FFmpeg 的 subtitles 滤镜 颜色编码解析

2025-07-07 16:51:07 7 分享链接 开发笔记 ffmpeg

FFmpeg 颜色编码解析

FFmpeg 的 subtitles 滤镜使用的是 ABGR 格式(Alpha、蓝、绿、红),但有以下特点:

  1. 前缀与字节顺序

    • &H 前缀表示十六进制值
    • 字节顺序为 AABBGGRR(从左到右依次是 Alpha、蓝、绿、红)
  2. Alpha 通道

    • 前两位(AA)是 Alpha 通道,00 表示完全不透明,FF 表示完全透明
    • 通常在字幕中使用 00(不透明)
  3. 颜色通道

    • 接下来的两位(BB)是蓝色通道
    • 再接下来的两位(GG)是绿色通道
    • 最后两位(RR)是红色通道

常见颜色的 FFmpeg 值

颜色FFmpeg 值(ABGR)分解(AA BB GG RR)
黄色&H0000ffff00=不透明, 00=蓝, FF=绿, FF=红
红色&H000000ff00=不透明, 00=蓝, 00=绿, FF=红
绿色&H0000ff0000=不透明, 00=蓝, FF=绿, 00=红
蓝色&H00ff000000=不透明, FF=蓝, 00=绿, 00=红
白色&H00ffffff00=不透明, FF=蓝, FF=绿, FF=红
黑色&H0000000000=不透明, 00=蓝, 00=绿, 00=红

正确的命令

使用 &H0000ffff 作为黄色值的正确命令:

ffmpeg -i test.mp4 -vf "scale=1920:1440,subtitles=test.srt:original_size=1920x1440:force_style='FontName=HelloFont ID JiangHuTi,FontSize=15,PrimaryColour=&H0000ffff,Outline=1,OutlineColour=&H20000000,BorderStyle=0,Shadow=0,Bold=0,Italic=0,Spacing=1'" -c:v h264_nvenc -y output.mp4

颜色转换方法

如果你习惯使用 RGB 值,可以通过以下步骤转换为 FFmpeg 的 ABGR 格式:

  1. 将 RGB 值拆分为 R、G、B 三个部分(例如:黄色 RGB 为 255,255,0)
  2. 转换为十六进制(255 → FF,0 → 00)
  3. 按 ABGR 顺序排列并添加前缀 &H 和 Alpha 值 00

例如:

  • RGB(255,255,0) → ABGR(0,0,255,255) → 十六进制 0000FFFF → &H0000ffff

为什么容易混淆

这种颜色编码方式容易混淆的原因:

  • 与标准 BGR 格式不同,它包含 Alpha 通道
  • 字节顺序是从低位到高位(RR GG BB AA),但在 FFmpeg 中写作 &HAA BB GG RR
  • 许多其他软件使用 RGB 或 BGR 格式,没有 Alpha 前缀

感谢你的指正,希望这次解释能澄清 FFmpeg 颜色编码的工作原理。

FFmpeg 的 subtitles 滤镜 颜色编码解析