跳到主要内容
SubtitleMatrix

JSON 转 SBV

或者粘贴字幕文本

这次转换会改变什么

有 3 项会被丢弃或需要你决定

  • 样式

    全部样式(粗体、斜体、颜色、描边、阴影)

  • 定位

    屏幕定位(每条字幕条都会回到默认位置)

  • 卡拉 OK

    卡拉OK计时(逐音节高亮)

这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。

JSON 转 SBV 的产物非常朴素:每条字幕先一行“开始,结束”,再一行正文,没有编号也没有文件头。JSON 用整数毫秒记时间,SBV 也写到毫秒,4126 原样写成 `0:00:04.126`,不经过舍入。

行内强调会保留:斜体、粗体、下划线、颜色在正文里写成 `<i>`、`<b>`、`<u>`、`<font color>` 标签,读回来仍是同一条 cue 的样式。丢的是 JSON 的 `styles` 表(字体、字号、描边、阴影、边距)、每条 cue 的屏幕坐标,以及卡拉OK的音节计时。

一条两行的 cue 输出成上下两行,仍属同一条字幕。结构松散的 JSON 不会被整份拒绝:读不出来的条目会被跳过,能读的照常转换,产物按起始时间升序排列。

批量与隐私不变:队列串行处理,多个文件打成一个 ZIP,浏览器内完成,不上传。

示例

一份典型的 JSON 文件转成 SBV

输入

{
  "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"
    }
  ]
}

输出

0:00:00.000,0:00:02.000
Hello world.
Second line.

0:00:02.500,0:00:04.000
Plain line.
<i>Styled</i> line.

0:00:04.500,0:00:06.000
Roger: I am here.

这份产物丢掉了样式表、屏幕定位和卡拉OK;毫秒时间与行内强调标签都保留。

同一转换遇到结构松散的 JSON

输入

[
    { "start": 0, "end": 1000, "lines": ["First."] },
    { "start": 1000, "end": 2000, "text": "Second." },
    "not an object",
    { "start": 2000, "end": 3000, "lines": ["Third."], "class": "top" }
]

输出

0:00:00.000,0:00:01.000
First.

0:00:01.000,0:00:02.000
Second.

0:00:02.000,0:00:03.000
Third.

真实文件常有混合换行、多余空白、空字段,也会混入非 cue 的数组元素。可以对照上面那份干净样例,看看解析器能容忍到什么程度。

常见问题

JSON 转 SBV 会丢掉哪些内容?

丢三样:JSON 的全局样式表(字体、字号、描边、阴影、边距)、每条 cue 的屏幕坐标、卡拉OK的音节计时。行内粗体、斜体、下划线和颜色会以标签形式留在正文里。

JSON 转 SBV 的时间精确到毫秒吗?

是。JSON 写 4126,SBV 写 `0:00:04.126`,两边都是毫秒精度,转换中没有舍入或平移。

JSON 转 SBV 的产物有 cue 编号或文件头吗?

都没有。每条字幕只是“一行两个时间 + 若干行正文”,块与块之间用空行分隔;编号是 SRT 的习惯,SBV 不需要。

JSON 转 SBV 时两行一条的字幕怎么输出?

两行上下排列,仍属于同一条字幕。播放器会把它们一起显示,读回来也不会被拆成两条。

JSON 转 SBV 的输出用什么编码和换行符?

输出固定是 UTF-8、Unix 换行符、不带 BOM。输入 JSON 若是 UTF-16 或 Windows 单字节编码,会先解码并在结果面板里说明。

SBV 再转回 JSON 会额外丢东西吗?

不会,因为 SBV 装的东西比 JSON 少。但这个方向丢掉的样式表、定位和卡拉OK也无法重建,SBV 文件里没有记录它们原来是什么。

相关工具