Aller au contenu principal
SubtitleMatrix

Format de sous-titres JSON

Ce que ce format peut exprimer

Style du texte
Polices, couleur, contour, ombre
Positionnement à l'écran
Oui
Minutage karaoké
Oui
Sauts de ligne dans un bloc
Oui
Chronologie
Heure de début et de fin pour chaque bloc
Résolution du minutage
1 ms
Minutage stocké en numéros d'image
Non
Texte de droite à gauche
Oui

Exemples

Un fichier JSON typique, et ce qu’on en lit

Fichier

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

Ce qu'il contient

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 colonne de droite n’est pas un fichier converti : c’est ce que ce site lit dans le fichier de gauche, et le point de départ de toute conversion de ce fichier.

Un fichier JSON abîmé, et ce qu’on en lit encore

Fichier

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

Ce qu'il contient

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)

Les vrais fichiers arrivent avec un BOM, des fins de ligne Windows, une ligne parasite avant une heure ou une heure illisible. Rien ne lève d’exception : ce qui n’est pas compris est signalé, jamais perdu en silence.

Convertir SubtitleMatrix JSON vers un autre format

Chacune de ces pages tourne entièrement dans votre navigateur. Les étiquettes indiquent ce que coûte cette direction avant de l'ouvrir.

Convertir vers ce format

Le JSON décrit des sous-titres comme une structure de données : un numéro de version, éventuellement une table de styles et un tableau de blocs. C’est la forme que produit ce site et celle que lisent les scripts, pas un format de lecteur vidéo.

La table ci-dessus est la fiche complète du format : une ligne à « non » indique exactement ce qu’une conversion vers JSON coûte, et chaque page de conversion liée plus bas l’annonce avant que vous n’ouvriez un fichier.

Un bloc JSON porte un `start` et un `end` en millisecondes entières, un tableau `lines` et, si besoin, un `style` qui renvoie à la table `styles`. Tout se convertit dans le navigateur, sans envoi ni compte.

Questions fréquentes

Qu’est-ce qu’un fichier JSON de sous-titres ?

C’est la forme propre à ce site : un champ de version, une table `styles` facultative et un tableau `cues` dont les temps sont des millisecondes entières. Il est sans perte à l’égard de tout ce que les autres formats savent exprimer, et il s’adresse aux scripts plutôt qu’aux lecteurs vidéo.

Le JSON stocke-t-il un style ?

Oui, et davantage que les autres formats : une table `styles` de polices, tailles, couleurs, contours et marges, plus des balises par ligne dans le tableau `tags`. Le minutage karaoké est stocké aussi. Chaque `style` de bloc renvoie à une entrée de la table, ce que la représentation interne appelle le `styleRef`.

Chaque bloc JSON a-t-il un début et une fin ?

Oui, et un instant s’écrit `4126`. C’est la finesse du format, la milliseconde, et le nombre est exact : un bloc peut être court, long ou chevaucher le suivant sans que rien ne soit sous-entendu.

Vers quel format convertir mon JSON ?

Aucune destination de ce site ne reprend tout ce qu’un fichier JSON contient : il n’y a donc pas de direction gratuite, et chaque page de conversion nomme sa propre liste de pertes. Choisissez la liste que vous pouvez accepter, pas le format que vous croisez le plus souvent.

Puis-je ouvrir un fichier JSON dans un éditeur de texte ?

Oui, à condition de garder virgules et guillemets en place. Les temps sont des millisecondes en nombres simples : un bloc à 1,25 seconde s’écrit `"start": 1250`.