Andare al contenuto principale
SubtitleMatrix

Convertire JSON in SSA

Oppure incollare il testo dei sottotitoli

Cosa cambia questa conversione

1 elemento viene scartato o richiede una decisione

  • Precisione

    la precisione della temporizzazione — l’orologio dell’uscita è più grossolano, quindi ogni timestamp è arrotondato al 10 ms più vicino

Questo elenco deriva dalla matrice delle capacità di questi due formati, non dal particolare file caricato. Un file specifico può perdere di più se usa caratteristiche che il formato consente ma la matrice non modella.

Questa pagina converte un file JSON in SSA. Si trascina il file nel riquadro, oppure si incolla il testo, e si riprende indietro la versione SSA. La conversione avviene interamente nel browser: nessun file viene caricato e non serve un account.

I due formati non conservano le stesse cose, e la differenza non è cosmetica: la precisione non ha dove stare in SSA. L’elenco qui sopra nasce da ciò che ciascuno dei due formati sa esprimere, non dal file che si carica, quindi la risposta è la stessa prima ancora di aprire qualcosa.

Un file va bene, e così un’intera stagione: la coda li lavora in ordine e i risultati scendono insieme in un unico ZIP.

Esempi

Un file JSON tipico, convertito in SSA

Ingresso

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

Uscita

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

In questa conversione si perde: precisione. Tutto il resto corrisponde riga per riga.

La stessa conversione su un input scomodo

Ingresso

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

Uscita

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

È il tipo di danno che hanno i file reali: fine riga misti, spazi vaganti, campi lasciati vuoti. Confronto con l’esempio ordinato qui sopra per vedere cosa il parser perdona.

Domande frequenti

Perché i tempi si sono spostati passando da JSON a SSA?

SSA scrive l’istante come `0:00:04.13` dove JSON lo scrive come `4126`: un centesimo di secondo contro un millesimo, quindi ogni timecode viene arrotondato ai 10 ms più vicini e 00:00:04,126 diventa 4,13 secondi. Nulla viene allungato o riordinato e nessun blocco si muove di più di 5 ms; se però i sottotitoli vanno allineati a un altro file, questo è l’unico punto in cui la conversione smette di essere esatta.

Che aspetto ha il risultato quando JSON diventa SSA?

Come SSA: niente numeri di blocco, ogni sottotitolo è una riga `Dialogue:` nella sezione `[Events]`, con un campo `Marked` dove SRT tiene il numero. Ogni blocco JSON diventa un blocco SSA, nello stesso ordine, con lo stesso testo.

Come esce in SSA un blocco JSON su due righe?

Come due righe separate da `\N`, che è il modo in cui SSA scrive un a capo forzato. L’abbinamento sopravvive: le due righe JSON restano un solo sottotitolo nel file SSA e il lettore le mostra insieme.

I blocchi JSON mantengono l’ordine nel file SSA?

Sì, e lungo la strada vengono ordinati per istante di inizio: prima il più anticipato, che è l’ordine atteso da ogni formato di questo sito e quello con cui i lettori li scorrono. Se il file JSON elencava i blocchi fuori sequenza, l’SSA li rimette in ordine: è un intervento sulla struttura del file, non sul contenuto, ed è voluto.

Posso riconvertire l’SSA in JSON?

Sì, e ha un elenco suo: la conversione da SSA a JSON perde il contenuto specifico del formato, cioè le sezioni globali e le righe di evento che JSON non modella. Quell’elenco è diverso da quello qui sopra perché i due formati conservano cose diverse.

Il file SSA conserva la codifica del file JSON?

No: l’uscita è UTF-8, con fine riga Unix e senza BOM, qualunque codifica usasse il JSON. Un file che arriva in UTF-16 o in una codifica a byte singolo di Windows viene decodificato in ingresso (il pannello del risultato lo segnala quando accade); quello che esce è sempre lo stesso SSA in UTF-8.

Strumenti correlati