基础知识储备入门
- 1.字幕概述
- 2. SSA(软字幕)
- 2.1 历史背景
- 2.2 SSA 的核心能力
- 2.3 V4 与 V4+(ASS)的关系
- 3. ASS
- 3.1 关键节段(Section)
- 3.2 ASS 标签(特效指令)
- 4. 渲染流程
- 4.1 概览流程图
- 4.2 常用库
- 5. 与现代弹幕的关系
1.字幕概述
字幕就是视频里出现的文字:台词翻译、歌词、甚至弹幕。从技术实现角度分为两类:
| 类型 | 特点 | 常见格式 |
|---|---|---|
| 硬字幕 | 直接画在视频画面上,无法关闭或修改,本质是视频内容的一部分。 | 内嵌在视频流中 |
| 软字幕 | 独立于视频的文件,播放器实时叠加到画面上,可开关、切换语言。 | SRT, ASS, SSA, VTT, PGS |
音视频开发中,软字幕才是研究的重点:它更灵活,也带来了渲染、同步、特效等一系列技术挑战。
2. SSA(软字幕)
2.1 历史背景
SSA 诞生于上世纪 90 年代,当时流行的字幕格式是 MicroDVD 和 SubRip(SRT),它们只能控制起止时间,没有任何样式或特效。SSA 的野心是:让字幕拥有接近视频编辑软件的效果——不同字体、颜色、边框、甚至简单动画。
2.2 SSA 的核心能力
- 支持多行样式定义(比如“说话人A用蓝色字”,“旁白用白色字”)
- 支持位置摆放(左上角、底部居中、屏幕任意座标)
- 支持简单变换(旋转、缩放、移动、模糊)
- 支持卡拉OK效果(逐字变色)
- 使用纯文本语法,可读可编辑
2.3 V4 与 V4+(ASS)的关系
后来出现了 Advanced SubStation Alpha(ASS),即 V4+ 版本。它加入了更精细的标签(如 \move, \fad, \clip)和更好的渲染模型。现在几乎所有播放器都优先支持 ASS(完全兼容 SSA),所以ASS 就是事实上的标准。
3. ASS
打开一个.ass文件,你会发现它非常像 Windows 的 INI 配置文件( INI 文件的魔改版):
[Script Info] Title: My Awesome Sub ScriptType: v4.00+ WrapStyle: 0 PlayResX: 1920 PlayResY: 1080 [V4+ Styles] Format: Name, Fontname, Fontsize, PrimaryColour, Outline, Bold, Italic, ... Style: Default,Arial,48,&H00FFFFFF,&H00000000,0,0,... [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:01.00,0:00:03.00,Default,,0,0,0,,{\move(100,100,200,200)}Hello world!3.1 关键节段(Section)
- [Script Info]:全局设定,如分辨率、标题、字幕引擎兼容性。
- [V4+ Styles]:样式表,定义几套“主题”:字体、大小、颜色、边框、阴影等。
- [Events]:时间轴 + 具体字幕内容。每条字幕可以指定使用哪个样式,并附加覆盖标签({…} 里的命令)。
- 其他可选的段如 [Aegisub Project Garbage](由字幕编辑工具 Aegisub 生成)可以忽略。
3.2 ASS 标签(特效指令)
在每一条 Dialogue 的 Text 字段中,可以用\标签(参数)临时修改样式。标签从左到右生效,可以嵌套。几个常用例子:
| 标签 | 含义 |
|---|---|
{\an5} | 对齐方式:5 表示居中(数字小键盘布局) |
{\fs20} | 修改字号为 20 |
{\c&HFF0000&} | 颜色改为蓝色(BGR 顺序,&H 表示十六进制) |
{\move(100,100,300,300)} | 从 (100,100) 移动到 (300,300) |
{\fad(200,200)} | 淡入 200ms,淡出 200ms |
{\k50}(卡拉OK) | 高亮 50 百分之一秒,常用于歌词 |
整条字幕的最终显示结果 = 基础样式 + 覆盖标签
4. 渲染流程
只需要一个解析器 + 状态机。整个流程比编译 C++ 简单一个数量级。
4.1 概览流程图
ASS文件 → 解析器 → 样式表/事件列表 → 时间轴控制器 → 渲染器 → 视频合成 ↑ ↓ └────────── 字体引擎(FreeType)─┘4.2 常用库
| 功能 | 常用库 |
|---|---|
| 解析 | ASS libass(主流),VSFilter(老旧 DirectShow) |
| 字体渲染 | FreeType + HarfBuzz(处理复杂排版) |
| 颜色 / 坐标 | 自家数学库,通常依赖 libass 内部实现 |
| 视频叠加 | OpenGL 纹理或多平面 YUV + 混合(libass 输出位图) |
libass几乎就是 ASS 字幕的代名词。它已经被集成到 FFmpeg、mpv、VLC 等所有主流播放器中。
5. 与现代弹幕的关系
很多人以为弹幕是新技术,其实弹幕播放器的鼻祖 niconico 使用的 Danmakufu 引擎,语法直接借鉴了 ASS 的\move、\fade等标签。随后 Bilibili 等站也延续了这一设计。
| 项目 | 传统 ASS 字幕 | 现代弹幕 |
|---|---|---|
| 来源 | 本地文件,手工制作或机翻 | 服务器实时下发,用户即时发送 |
| 数量 | 同时显示 ≤ 10 条 峰值 | 每秒几百条,屏幕上经常 > 50 条 |
| 特效 | 预设动画(移动、旋转、卡拉OK) | 滚动、顶部、底部、反向、高级轨迹 |
| 渲染 | 单机 libass,逐帧绘制 | 浏览器 Canvas/WebGL,高度优化缓存 |
| 交互 | 无 | 点赞、屏蔽关键词、透明度调节 |
技术上的共同点:
都用时间轴驱动(每个弹幕有自己的生命期)
都支持标签式语法(虽然弹幕通常转成 JSON)
底层渲染都依赖纹理 + 混合
不同点:弹幕为了高并发,往往舍弃了 ASS 复杂的样式继承和矢量裁剪,改用更轻量的预定义模式(滚动、静止、移动路径)。
可以这样理解:弹幕是“被阉割但仍保留 ASS 灵魂”的实时字幕系统。