Aller au contenu principal
SubtitleMatrix

Convertir JSON en SSA

Ou collez le texte d'un sous-titre

Ce que cette conversion change

1 élément perdu ou à décider

  • Précision

    la précision du minutage — l'horloge de la sortie est plus grossière, chaque code temporel est donc arrondi au 10 ms le plus proche

Ce rapport de pertes vient de la matrice de capacités de ces deux formats, pas du fichier particulier que vous avez chargé. Un fichier précis peut perdre davantage s'il utilise des fonctionnalités que le format autorise mais que la matrice ne modélise pas.

Cette page convertit un document JSON en script SSA. Chaque bloc devient une ligne `Dialogue:` dans `[Events]`, la table `styles` alimente `[V4 Styles]`, et chaque entrée du tableau `lines` reste groupée grâce à `\N`.

SSA mesure le temps au centième de seconde : vos `start` et `end` en millisecondes sont arrondis au centième, sans réordonnancement et avec au plus 5 ms d’écart. Styles, positions et karaoké, eux, passent. La liste ci-dessus vient des capacités, pas de votre fichier.

Un fichier ou une saison entière : la file les traite dans l’ordre et le ZIP arrive à la fin. Aucun envoi, aucun compte.

Exemples

Un fichier JSON typique, converti en SSA

Entrée

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

Sortie

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

Dans cette sortie, seule la précision est perdue : les millisecondes deviennent des centièmes. Le reste correspond bloc par bloc.

La même conversion sur une entrée abîmée

Entrée

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

Sortie

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

C’est le genre de dégâts des vrais fichiers : fins de ligne mélangées, espaces parasites, champs vides. Comparez avec l’exemple propre ci-dessus pour voir ce que le lecteur pardonne.

Questions fréquentes

Pourquoi les horodatages du JSON changent-ils dans un script SSA ?

SSA écrit `0:00:04.13`, au centième de seconde, là où le JSON écrit `4126`, au millième. Chaque borne est donc arrondie aux 10 ms les plus proches. Rien n’est étiré, réordonné ou décalé de plus de 5 ms.

À quoi ressemble un fichier JSON converti en SSA ?

Chaque bloc JSON devient une ligne `Dialogue:` avec un champ `Marked` à la place du numéro du SRT, dans la section `[Events]`. La table `styles` remplit `[V4 Styles]`, et le fichier commence par un en-tête `[Script Info]`.

Le style, la position et le karaoké du JSON passent-ils dans un SSA ?

Oui. La table `styles` est traduite en styles SSA, l’objet `position` en `\pos(x,y)` ou `{\anN}`, et les plages karaoké en balises `\k`. C’est plus que le SRT ne sait faire, avec seulement l’arrondi au centième comme perte.

Comment un bloc JSON à deux lignes sort-il dans un script SSA ?

Les deux entrées de `lines` restent dans le même `Dialogue:`, séparées par `\N`. Le regroupement est conservé, et le lecteur les affiche ensemble.

Le retour d’un script SSA vers le JSON ajoute-t-il des pertes ?

Il a sa propre liste : SSA vers JSON perd le contenu propre au format, notamment `[Script Info]`, `[Fonts]` et les lignes `Comment:`. Les deux listes diffèrent parce que les formats ne gardent pas la même chose.

Outils associés