Ir para o conteúdo principal
SubtitleMatrix

Converter JSON para SSA

Ou cole o texto da legenda

O que esta conversão altera

1 coisa é descartada ou precisa de uma decisão

  • Precisão

    a precisão dos tempos — o relógio da saída é mais grosseiro, então cada marca de tempo é arredondada para o 10 ms mais próximo

Esta lista vem da matriz de capacidades destes dois formatos, não do arquivo específico que você carregou. Um arquivo específico pode perder mais se usar recursos que o formato permite mas a matriz não modela.

Esta página converte JSON em SSA. Arraste um arquivo — ou cole o texto — e receba a versão SSA de volta. A conversão roda inteiramente no seu navegador, então nada é enviado e nenhuma conta é necessária.

Estes dois formatos não guardam as mesmas coisas, e a diferença não é cosmética: precisão não tem para onde ir no SSA. A lista acima vem do que cada um dos formatos consegue expressar, não do seu arquivo, então a resposta é a mesma antes de você carregar qualquer coisa.

Um arquivo está bom, e uma temporada inteira também: a fila processa na ordem e os resultados descem juntos num único ZIP.

Exemplos

Um arquivo JSON típico, convertido para SSA

Entrada

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

Saída

[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.

Perdido nesta saída: precisão. Todo o resto corresponde linha a linha.

A mesma conversão sobre uma entrada problemática

Entrada

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

Saída

[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.

É o tipo de dano que os arquivos reais têm: fim de linha misturado, espaço sobrando, campos vazios. Compare com o exemplo organizado acima para ver o que o analisador perdoa.

Perguntas frequentes

Por que os tempos se movem de JSON para SSA?

O SSA guarda o tempo como 0:00:04.13, contra 4126 do JSON: centésimo de segundo contra milésimo, então cada timecode é arredondado para os 10 ms mais próximos. Nada é esticado nem reordenado e nenhum bloco se move mais de 5 ms, mas ao alinhar estas legendas com outro arquivo esse é o ponto em que a conversão deixa de ser exata.

Como fica a saída quando JSON vira SSA?

Fica no formato SSA: os estilos vão para a seção V4 Styles e cada legenda é uma linha Dialogue em Events, com um campo Marked onde o SRT guarda o número. Cada bloco JSON vira um Dialogue, na mesma ordem, com o mesmo texto.

As duas linhas de um bloco JSON viram o quê no SSA?

Viram duas linhas unidas por um \N, a marca de quebra de linha do SSA. O vínculo se mantém: as duas linhas do JSON continuam pertencendo a uma única legenda no SSA, e o player as mostra juntas.

A ordem dos blocos JSON se mantém no SSA?

Se mantém, com os blocos ordenados pelo início no caminho, do mais cedo para o mais tarde, que é como os players leem. Se o seu JSON listava os blocos fora de ordem, o SSA os devolve em ordem; a mudança é de estrutura, não de conteúdo, e é deliberada.

Consigo converter o SSA de volta para JSON?

Consegue, e essa direção tem lista própria: converter SSA para JSON descarta o conteúdo específico do formato, e a seção V4 Styles chega ao JSON como objetos styles. A lista difere da de cima porque os dois formatos guardam coisas diferentes.

O SSA de saída mantém a codificação do arquivo JSON?

Não: o SSA gerado é sempre UTF-8, com fim de linha Unix e sem BOM, mesmo que o JSON tenha vindo em UTF-16 ou numa codificação de byte único do Windows. A decodificação acontece na entrada, e o painel de resultado informa quando ela foi necessária.

Ferramentas relacionadas