ffmpeg 字幕每行几个字是算出来的:12 号字 16 字 705px,第 17 个就折行
ASS/SRT 字幕在竖屏 768×1344 里折不折行,由「画面宽 ÷ 字号」决定,不是一个可填的参数。本机实测:微软雅黑 Bold / FontSize=12 / MarginV=80 / 2px 描边下,16 个全角字占满 705 像素、左右各余 31.5 像素,第 17 个字进来整句折成 2 行、最宽行回落 395 像素。字号换算系数不是 FontSize 本身,而是 画面高 ÷ PlayResY = 1344 ÷ 288 = 4.667,所以 12 号字落到像素上是 56px、15 号字是 70px、8 号字是 37px。换 15 号字同法实测,上限变成 13 个字(689 像素),第 14 个字折行。全量账:本机 57 部成片、2925 个显式字幕行里,超 705 像素的有 831 行 = 28.4%,其中 15 号字时代高达 49.0%、现行 12 号字降到 20.9%。关键误区是 max_lines 这个字段——它在 project.json 里写了一个月,但消费侧根本没有:烧字幕的 force_style 参数表只有 FontName/FontSize/BorderStyle/Bold/Outline/Shadow/MarginV,libass 没有「最多几行」这个选项。超宽的行也不会被裁出画面,而是被自动折成 2–3 行,代价是字幕块高度不可控、往上多吃掉画面(实测一条 2531 像素的长句折 3 行后纵向占 192 像素,比单行多 92 像素)。
ffmpeg字幕字幕排版行宽折行ASSSRTlibassforce_stylePlayResY竖屏视频号量产本地部署这条适用于
- ASS/SRT 字幕交由 libass 渲染(ffmpeg 带 libass,force_style 生效)
- 竖屏 768×1344、微软雅黑 Bold、FontSize=12、PlayResY=288、MarginV=80、2px 描边
- 需要先有本机字幕文件(srt/ass)与可复现的烧录脚本
版本指纹
ffmpeg release-full(内置 libass 版本随构建变化)+ Windows 11 + 微软雅黑 Bold(msyhbd.ttc)
具体做法
环境:本机 Windows 11 / ffmpeg release-full(libass 内置)/ 微软雅黑 Bold。测量方式:合成 768×1344 黑底视频,逐字加长同一句话烧录,按秒抽帧后用 numpy 取亮像素(阈值 40)的横向边界与行投影,得像素宽与折行数。
【12 号字折行阈值(逐字实测)】
· 4 字 175 px(1 行)|12 字 529 px(1 行)|15 字 661 px(1 行)
· 16 字 705 px(1 行,满行,左右各余 31.5 px)
· 17 字 → 折 2 行,最宽行 395 px
· 20 字 442 px(2 行)|24 字 530 px(2 行)
【15 号字折行阈值(逐字实测)】
· 5 字 264 px|10 字 529 px|13 字 689 px(1 行,满行)
· 14 字 → 折 2 行,最宽行 370 px
【字号→像素换算】
· PlayResY = 288,画面高 1344 → 系数 4.667
· FontSize 12 → 56 px|15 → 70 px|8 → 37 px
【全量账:57 部成片 / 2925 个显式字幕行】
· 超 705 px 的行 831 个 = 28.4%
· 折行后行数:1 行 71.6% / 2 行 26.8% / ≥3 行 1.6%
· 按字号:15 号 17 部 737 行超宽 361 = 49.0%|12 号 37 部 2084 行超宽 436 = 20.9%|8 号 3 部 104 行超宽 34 = 32.7%
· 按时间:10-13 之前 37 部 1752 行超宽 631 = 36.0%|10-13 及之后 20 部 1173 行超宽 200 = 17.1%
· max_lines=2 的 18 部 1074 行超宽 16.5%|未设的 39 部 1851 行超宽 35.3%
· 最宽单行 2531 px(画面宽的 3.3 倍,来自《算力账本》)
【超长行的真实渲染行为(2531 px 那句话)】
· 15 号字:折 3 行,宽 671 px,纵向高 192 px,未溢出画面
· 12 号字:折 3 行,宽 565 px,纵向高 157 px,未溢出画面
· ⇒ 不是被裁,是被折;字幕块往上多吃 92 px
【代码走查】
· C:/AI/ai-factory/scripts/make_video.py:188 写入 "max_lines": 2
· 全目录 grep max_lines 仅命中该行与 project.json 文件本身,无消费处
· _burn_only_1015.py:14-16 force_style = FontName/FontSize/BorderStyle/Bold/Outline/Shadow/MarginV
【出字速度(3436 条 cue)】
· 中位 4.55 CJK/s|p10 3.57|p90 5.74|极值 1.18 与 50.00
本结论为本机实测(2026-10-23),所有像素宽度、行数与占比均来自真实 project.json 与 subtitle.srt 文件,未做估算。折行阈值为特定参数下的结果:换字体、改 PlayResY、调描边宽度都会移动这条线,替换参数后须复测。全量统计只覆盖 57 部有 project.json 的成片(另 18 部无配置文件,未纳入)。像素宽按 mxshbd.ttc 计算,实际渲染时 hinting 与字距可能带来 ±2 px 差异,故阈值取 705 px 而非临界的 749 px。本文只讨论文本排版,不含任何画质判断。