Andare al contenuto principale
SubtitleMatrix

Formato sottotitoli JSON

Cosa sa esprimere questo formato

Stile del testo
Caratteri, colore, contorno, ombra
Posizionamento sullo schermo
Sì
Temporizzazione karaoke
Sì
Interruzioni di riga dentro un blocco
Sì
Timeline
Orario di inizio e di fine per ogni blocco
Risoluzione temporale
1 ms
Temporizzazione memorizzata come numeri di fotogramma
No
Testo da destra a sinistra
Sì

Esempi

Un file JSON tipico, e cosa se ne legge

File

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

Cosa contiene

3 cues, 5 lines of text

  0 ms → 2000 ms
    Hello world.
    Second line.
    [Default; position 100,200 (center)]
  2500 ms → 4000 ms
    Plain line.
    Styled line.   [italic ×1]
  4500 ms → 6000 ms
    Roger: I am here.
    [speaker Roger]

Outside the cues:
  styles     Default
  other keys version, title, fps, generator — carried through untouched

La parte destra non è un file convertito: è ciò che questo sito legge dalla parte sinistra, e il punto di partenza di ogni conversione di quel file.

Un file JSON scomodo, e cosa se ne legge comunque

File

{
    "cues": [
        { "start": "0:00:01,5", "end": "0:00:03,0", "text": "Unpadded timecode." },
        { "start": 4000.5, "end": 5000, "lines": ["Fractional start.", { "text": "Second.", "tags": [] }] },
        { "start": 9000, "end": 8000, "lines": ["End before start."] },
        { "start": "nope", "end": 12000, "lines": ["No readable start."] },
        { "start": 13000, "lines": ["No end at all."] }
    ],
    "generator": "subtitlematrix boundary",
    "styles": {},
    "title": "Fixture: boundary"
}

Cosa contiene

3 cues, 4 lines of text

  1500 ms → 3000 ms
    Unpadded timecode.
  4001 ms → 5000 ms
    Fractional start.
    Second.
  9000 ms → 9001 ms
    End before start.

Outside the cues:
  other keys generator, title — carried through untouched

Reported while reading — repaired or skipped, never silently:
  2 × entries with no readable start and end time (they are not cues, so they were skipped)
  1 × cue times that were not whole milliseconds (they were rounded to the nearest millisecond)
  1 × cues whose end time was not after their start time (they were given a 1ms duration)

I file reali arrivano con un BOM, fine riga di Windows, una riga vagante prima di un timecode o un timecode che non si riesce a leggere. Niente di tutto ciò solleva eccezioni: quello che non si capisce viene segnalato invece che scartato in silenzio.

Convertire SubtitleMatrix JSON in un altro formato

Ognuna di queste funziona interamente nel browser. Le etichette dicono cosa costa quella direzione prima di aprirla.

Conversione verso questo formato

JSON di SubtitleMatrix è uno dei formati di sottotitoli trattati da questo sito, e questa pagina ne è il riferimento: cosa sa conservare, cosa no, e una pagina per ogni formato in cui lo si può convertire.

La tabella qui sopra è tutto: non esiste un elenco di funzioni nascoste. Quando una riga dice no, è esattamente ciò che si perde convertendo in JSON, e ogni pagina di conversione linkata più sotto lo dichiara prima di aprire un file.

Ognuna di quelle conversioni gira nel browser. Nessun file viene caricato e non serve un account, il che conta per materiale coperto da riservatezza, per una cartella clinica o per un embargo di messa in onda.

Domande frequenti

Che cos’è un file JSON?

Qui `.json` è la forma di sottotitoli di questo sito: un campo di versione, una tabella di stili facoltativa e un array di blocchi con i tempi in millisecondi. È volutamente senza perdite rispetto a tutto ciò che gli altri formati sanno esprimere, ed è pensato per script e pipeline più che per i lettori.

JSON conserva lo stile?

Sì, e più degli altri: una tabella di stili con caratteri, dimensioni, colori, contorni e margini, più i codici per blocco dentro il testo, così una riga può essere grassetta, colorata e posizionata senza alcuno stile con nome. Anche il karaoke viene conservato. Qui la tabella è un oggetto `styles` indicizzato per nome dello stile, e lo stile del singolo blocco viaggia nell’array `tags` di ogni riga invece che come codice dentro il testo: per questo in ingresso e in uscita non va fatto alcun escape.

Ogni blocco JSON conserva sia un inizio sia una fine?

Sì, e un istante in un file JSON si legge `4126`. È la precisione massima di JSON, il millisecondo, e il numero è esatto, quindi un blocco può essere corto, lungo o sovrapporsi al successivo senza che nulla venga sottinteso.

In quale formato conviene convertire un JSON?

Nessun formato di questo sito prende tutto ciò che un file JSON contiene, quindi non esiste una direzione gratuita: ogni pagina di conversione dichiara il proprio elenco di perdite. Si sceglie la destinazione in base a quale di quegli elenchi si può accettare, non in base al formato che si è visto più spesso.

Posso aprire un file JSON in un editor di testo?

Sì, se si tengono a posto virgole e virgolette. I tempi sono millisecondi come numeri puri, quindi un blocco a 1,25 secondi è `"start": 1250`.