跳到主要内容
SubtitleMatrix

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 若是别的编码,会先解码并在结果面板里说明。

相关工具