跳到主要内容
SubtitleMatrix

JSON 转 MicroDVD

或者粘贴字幕文本

选项

时间按哪个帧率计算。在格式页面里,这是 MicroDVD 需要的值,因为它把时间存成帧号。在帧率页面里,它是文件当初对应的速率 —— 字幕是按这个版本做的 —— 而页面的第二个框填你要拿它配套的视频速率。常见的有 23.976、24、25、29.97、30、50、59.94 和 60。填错会让整条时间轴偏移;在帧率页面里,偏移是按比例发生的,而不是一个固定的量。

这次转换会改变什么

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

  • 样式

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

  • 定位

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

  • 卡拉 OK

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

  • 帧率

    该格式以帧号存储时间——时间取决于你提供的帧率

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

JSON 转 MicroDVD 的产物是帧号对,不是时钟时间:每条字幕写成 `{起始帧}{结束帧}`,正文跟在后面,文件第一行 `{1}{1}25` 声明这份文件按 25 fps 计算。JSON 里的整数毫秒因此要先按你给的帧率换算成帧号,再写进花括号;同一条 cue 在 25 fps 与 29.97 fps 下会落到不同的帧号。

帧率是这一页最关键的参数:它决定同样的毫秒数落在第几帧。填成目标视频的帧率(常见 23.976、25、29.97)。填对了从头到尾同步;填错了开头几乎看不出来,越到后面偏得越多。

JSON 的样式、屏幕定位和卡拉OK在这个格式里都没有落点,全部列在有损说明里。一条两行的 cue 写成一行,用 `|` 分隔两半;条目按起始时间升序输出。

转换在浏览器内完成:文件不上传,批量队列把多个结果打包成一个 ZIP。

示例

一份典型的 JSON 文件转成 MicroDVD

输入

{
  "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}{1}25
{0}{50}Hello world.|Second line.
{63}{100}Plain line.|Styled line.
{113}{150}Roger: I am here.

这份产物丢掉了样式、定位、卡拉OK和帧率依赖;首行的 `{1}{1}25` 声明了换算用的帧率。

同一转换遇到结构松散的 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}{1}25
{0}{25}First.
{25}{50}Second.
{50}{75}Third.

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

常见问题

JSON 转 MicroDVD 时帧率应该填多少?

填目标视频的帧率,例如 23.976、25 或 29.97。25 fps 下 4 秒正好是第 100 帧;填错时开头偏差很小,但每过一秒都会多累积一点,长片尤其明显。

JSON 转 MicroDVD 为什么一定要帧率?

MicroDVD 不存时钟时间,只存帧号对,例如 `{103}{175}`。没有帧率就无法把 JSON 的毫秒换算成帧号,所以这一页把帧率作为输入,并在产物首行声明。

JSON 转 MicroDVD 会保留样式、定位和卡拉OK吗?

都不会。这个格式只认帧号与正文,行内标签、`styles` 表、坐标和音节计时都没有落点,全部列进有损说明。

JSON 转 MicroDVD 时两行字幕怎么写成一行?

用竖线 `|` 连接两半,例如 `Hello world.|Second line.`。这是 MicroDVD 表示硬换行的方法,读回来仍是同一条字幕。

JSON 转 MicroDVD 后还能按毫秒对齐吗?

产物里没有毫秒,只有帧号。同步精度由帧率决定:25 fps 下一帧是 40 毫秒,所以边界会落在最近的帧上,不再是任意毫秒。

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

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

相关工具