跳到主要内容
SubtitleMatrix

JSON 转 SRT

或者粘贴字幕文本

这次转换会改变什么

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

  • 样式

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

  • 定位

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

  • 卡拉 OK

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

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

这一页把本站的 JSON 字幕文档写成 SRT。解析接受两种形状:带版本号和 cues 数组的完整文档,以及直接由 cue 组成的数组;每条 cue 只要有 start、end 和文本就能读。JSON 的时间单位就是毫秒,SRT 也存毫秒,所以时间轴原样搬过去,不做舍入。

SRT 只装得下编号、时间码和正文。JSON 文档里的 title、fps 与 `styles` 表会被读出来并在有损说明里点名,而不是悄悄丢掉;行内斜体、粗体、颜色写成 `<i>`、`<b>`、`<font color>` 标签,屏幕定位与卡拉OK计时没有落点。

损坏的文件不会中断转换:end 早于 start 的 cue 会被修复成可加载的一条,读不出来的条目会被跳过并计数。产物按 start 升序排列,玩家读到的顺序因此始终正确。

批量转换在本机完成,多个 JSON 的结果打包成一个 ZIP;文件不上传,也不需要账号。

示例

一份典型的 JSON 文件转成 SRT

输入

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

输出

1
00:00:00,000 --> 00:00:02,000
Hello world.
Second line.

2
00:00:02,500 --> 00:00:04,000
Plain line.
<i>Styled</i> line.

3
00:00:04,500 --> 00: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" }
]

输出

1
00:00:00,000 --> 00:00:01,000
First.

2
00:00:01,000 --> 00:00:02,000
Second.

3
00:00:02,000 --> 00:00:03,000
Third.

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

常见问题

JSON 转 SRT 接受哪些 JSON 结构?

两种:本站写出的“版本号 + cues 数组”,以及文件本身就是 cue 数组的形式。判断标准是每条 cue 是否有 start、end 和文本,而不是文件开头有没有版本号。

JSON 转 SRT 后,标题、样式表和帧率去哪了?

都被读出来并列入有损说明,因为 SRT 没有字段放它们。帧率尤其没有落点——SRT 存的是时钟时间,不是帧号,所以它不会被静默使用。

JSON 转 SRT 的毫秒会被舍入吗?

不会。SRT 的时间精度是毫秒,JSON 也以毫秒记录,每个 start 和 end 都原样转移,时间轴不会漂移。

JSON 转 SRT 时,end 早于 start 的 cue 会怎么处理?

转换器会把它修复成一条可加载的字幕,而不是拒绝整份文件。修复后的时间需要你对照视频确认,因为原文件已经提示这里有问题。

JSON 转 SRT 会保留斜体和粗体吗?

行内强调会:斜体写成 `<i>`、粗体写成 `<b>`、颜色写成 `<font color>`。JSON 的全局样式表(字体、字号、描边、边距)没有落点,会被丢掉。

JSON 转 SRT 的输出用什么编码?

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

相关工具