You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FFmpeg字幕自定义文字与背景颜色问题:HEX转AARRGGBB异常

问题原因与修复方案

你的问题出在颜色格式的字节顺序错误,加上错误的字符串截取操作,导致FFmpeg解析颜色时完全颠倒。

具体来说:

  • FFmpeg的ASS字幕样式(比如PrimaryColour、OutlineColour)要求颜色是BGRA字节顺序的十六进制值,前缀用&H,格式为&HBBGGRRAA(BB=蓝色通道,GG=绿色通道,RR=红色通道,AA=透明度)。
  • 但你用tinycolor的toHex8()返回的是RGBA顺序的字符串(格式为RRGGBBAA),而且错误地用substr(2)切掉了前两位的红色通道值,剩下的GGBBAA被FFmpeg当成BBGGRR解析,自然颜色完全错乱——比如你要的黑色#000000,处理后变成&H0000FF,FFmpeg会把它解析成BB=00, GG=00, RR=FF,也就是红色。

修复步骤

  1. 去掉错误的substr(2)操作,完整获取tinycolor返回的8位RGBA十六进制字符串。
  2. 将RGBA顺序转换为FFmpeg要求的BGRA顺序。

修正后的代码示例:

var alpha = 1.0;

const textColorHex = "#000000";
const bgColorHex = '#ffffff';

// 转换颜色为FFmpeg要求的BGRA格式
function toFFmpegColor(hex, alphaVal) {
  const color = tinycolor(hex).setAlpha(alphaVal);
  const rgba = color.toHex8(); // 得到RRGGBBAA格式的字符串
  // 拆分通道并重组为BBGGRRAA
  const rr = rgba.slice(0, 2);
  const gg = rgba.slice(2, 4);
  const bb = rgba.slice(4, 6);
  const aa = rgba.slice(6, 8);
  return `&H${bb}${gg}${rr}${aa}`;
}

const textColor = toFFmpegColor(textColorHex, alpha); // 结果为&H000000FF
const bgColor = toFFmpegColor(bgColorHex, alpha); // 结果为&HFFFFFFFF

const ffmpeg = spawn("ffmpeg", [
  "-i",
  "test.mp4",
  "-vf",
  `subtitles=${subtitlePath}:force_style='Alignment=${alignment},OutlineColour=${bgColor},BorderStyle=3,PrimaryColour=${textColor},Fontsize=${fontSize}'`,
  "-c:a",
  "copy",
  "-progress", "pipe:1",
  outputPath,
]);

额外说明

  • 如果你的alpha值固定为1.0(完全不透明),最后两位的AA是FF,也可以选择省略AA部分,直接用&HBBGGRR,结果是一样的。
  • FFmpeg对十六进制的大小写不敏感,不用纠结tinycolor返回的是小写还是大写格式。

内容的提问来源于stack exchange,提问作者Youssef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:22:50