JSON 转 SSA
或者粘贴字幕文本
这次转换会改变什么
有 1 项会被丢弃或需要你决定
- 精度
时间精度——输出的时间刻度更粗,因此每个时间戳都会四舍五入到最接近的 10 毫秒
这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。
JSON 转 SSA 把字幕写成 SubStation Alpha 脚本。JSON 的毫秒边界在这里只到百分秒:4126 写成 `0:00:04.13`,舍入到最近的 10 毫秒,单条最多移动 5 毫秒。这是这一页唯一的有损项——样式表、行内样式、屏幕定位和卡拉OK在 SSA 里都有对应写法。
JSON 的 `styles` 表写进 `[V4 Styles]`,字体、字号、颜色和粗斜体落在 Style 行;带坐标的 cue 输出为带 `{\pos(x,y)}` 前缀的一条。每条字幕是一条 `Dialogue:` 行,用 `Marked` 字段占住 SRT 里编号的位置。
两行的 cue 用 `\N` 连成一条 Dialogue;条目按 start 升序重排。结构松散的 JSON 不会被整份拒绝:能读的照常转换,读不出来的条目跳过并计数。
多个文件可以一次拖入,串行转换、打包成一个 ZIP;全部在浏览器内完成,文件不上传。
示例
一份典型的 JSON 文件转成 SSA
输入
{
"version": 1,
"title": "Fixture: typical",
"fps": 25,
"styles": {
"Default": {
"name": "Default",
"fontFamily": "Arial",
"fontSize": 20,
"primaryColor": "#FFFFFF",
"bold": false,
"italic": false
}
},
"generator": "subtitlematrix fixtures",
"cues": [
{
"id": "1",
"start": 0,
"end": 2000,
"lines": [
"Hello world.",
"Second line."
],
"style": "Default",
"position": {
"x": 100,
"y": 200,
"align": "center"
}
},
{
"id": "2",
"start": 2500,
"end": 4000,
"lines": [
"Plain line.",
{
"text": "Styled line.",
"tags": [
{
"kind": "italic",
"start": 0,
"end": 6
}
]
}
]
},
{
"id": "3",
"start": 4500,
"end": 6000,
"lines": [
"Roger: I am here."
],
"speaker": "Roger"
}
]
}
输出
[Script Info]
Title: Fixture: typical
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,,,,0,0,,,,,,,,,
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:02.00,Default,,0,0,0,,{\pos(100,200)}Hello world.\NSecond line.
Dialogue: 0,0:00:02.50,0:00:04.00,Default,,0,0,0,,Plain line.\N{\i1}Styled{\i0} line.
Dialogue: 0,0:00:04.50,0:00:06.00,Default,,0,0,0,,Roger: I am here.
这份产物只丢精度;样式、定位与多行结构都写进了脚本。
同一转换遇到结构松散的 JSON
输入
[
{ "start": 0, "end": 1000, "lines": ["First."] },
{ "start": 1000, "end": 2000, "text": "Second." },
"not an object",
{ "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]
输出
[Script Info]
ScriptType: v4.00
[V4 Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding
Style: Default,Arial,20,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,1,2,2,2,10,10,10,0,1
[Events]
Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:01.00,Default,,0,0,0,,First.
Dialogue: 0,0:00:01.00,0:00:02.00,Default,,0,0,0,,Second.
Dialogue: 0,0:00:02.00,0:00:03.00,Default,,0,0,0,,Third.
真实文件常有混合换行、多余空白、空字段,也会混入非 cue 的数组元素。可以对照上面那份干净样例,看看解析器能容忍到什么程度。
常见问题
JSON 转 SSA 后,毫秒时间戳会变成什么?
SSA 的时间只到百分秒,4126 毫秒写成 `0:00:04.13`。每个边界舍入到最近的 10 毫秒,单条最多偏 5 毫秒,顺序不变。
JSON 转 SSA 只丢时间精度吗?
对。样式表、行内粗斜体、屏幕定位和卡拉OK在 SSA 里都有对应字段,因此有损说明里只有精度这一项。
JSON 转 SSA 的样式表怎么写进产物?
`styles` 对象里的每种样式输出成 `[V4 Styles]` 下的一行 Style,包含字体、字号、主色和粗斜体等字段。没有写出的字段留空,由播放器补默认值。
JSON 转 SSA 时屏幕定位还在吗?
在。带坐标的 cue 在输出里带 `{\pos(x,y)}` 前缀,位置由 SSA 渲染器解释,不会退回到播放器的默认位置。
JSON 转 SSA 时两行字幕怎么输出?
写成一条 Dialogue,两行之间用 `\N` 连接。这是 SSA 的硬换行写法,两行仍属于同一条字幕。
JSON 转 SSA 的输出用什么编码?
输出固定是 UTF-8、Unix 换行符、不带 BOM。输入 JSON 若是别的编码,会先解码并在结果面板里说明。