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,也就是红色。
修复步骤
- 去掉错误的
substr(2)操作,完整获取tinycolor返回的8位RGBA十六进制字符串。 - 将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
相关产品推荐
相关产品推荐

