Naar de hoofdinhoud
SubtitleMatrix

TTML naar JSON

FormaatconversieTTML / DFXP
Of plak ondertiteltekst

Wat deze conversie verandert

1 ding vervalt of vraagt om een beslissing

  • Formaatspecifieke inhoud

    inhoud die het bronformaat buiten zijn blokken bewaart (blokken die geen ondertitel zijn, koptekst, instellingen per blok, uitgecommentarieerde gebeurtenissen) — het doelformaat heeft er geen plek voor

Deze lijst komt uit de capaciteitenmatrix voor deze twee formaten, niet uit het bestand dat je hebt geladen. Een specifiek bestand kan meer verliezen wanneer het kenmerken gebruikt die het formaat toestaat maar de matrix niet modelleert.

Deze pagina zet TTML om naar JSON. De uitvoer is één object met een versienummer en een lijst cues; elke cue heeft een start, een eind en de tekstregels. De tijden zijn milliseconden, precies zoals TTML ze kent.

TTML bewaart zijn uiterlijk en plaatsing in de head, in een styling- en een layout-tabel. Die tabellen worden niet naar het styles-object van de JSON vertaald: dat blijft leeg. Opmaak die in de tekst zelf zit, zoals een cursieve span, is een eigenschap van de regel en komt wel mee in de tags-array.

Een blok van twee regels blijft één cue met twee waarden in lines. De omzetting draait in je browser, zonder upload; meerdere bestanden gaan samen in één ZIP.

Voorbeelden

Een gewoon TTML-bestand, omgezet naar JSON

Invoer

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling" xml:lang="en">
  <head>
    <styling>
      <style xml:id="s1" tts:color="#FFFF00" tts:fontWeight="bold"/>
    </styling>
    <layout>
      <region xml:id="bottom" tts:origin="10% 80%" tts:extent="80% 20%"/>
    </layout>
  </head>
  <body>
    <div>
      <p begin="00:00:01.000" end="00:00:03.500" region="bottom" style="s1">Hello <span tts:fontStyle="italic">there</span>.</p>
      <p begin="00:00:03.500" end="00:00:06.000" region="bottom">How are you?<br/>Fine, thanks.</p>
    </div>
  </body>
</tt>

Uitvoer

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3500,
      "lines": [
        {
          "text": "Hello there.",
          "tags": [
            {
              "kind": "italic",
              "start": 6,
              "end": 11
            }
          ]
        }
      ]
    },
    {
      "start": 3500,
      "end": 6000,
      "lines": [
        "How are you?",
        "Fine, thanks."
      ]
    }
  ]
}

In deze uitvoer gaat formaateigen inhoud verloren: de koptabellen worden niet overgezet. De tijden, de tekst en de groepering per cue blijven gelijk.

Dezelfde omzetting op een weerbarstige invoer

Invoer

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling"
    xmlns:ttp="http://www.w3.org/ns/ttml#parameter"
    ttp:frameRate="25" xml:lang="en">
  <body>
    <div>
      <p begin="1.5s" dur="2s">Loaded from an offset and a duration.</p>
      <p begin="4s" end="00:00:06.50">A coarser clock spelling.</p>
      <p begin="00:00:07:00" end="00:00:08:12">Frames, at 25fps.</p>
      <p begin="9s"><span tts:color="#FF0000">Half-open</span> and Tom &amp; Jerry.</p>
    </div>
  </body>
</tt>

Uitvoer

{
  "version": 1,
  "cues": [
    {
      "start": 1500,
      "end": 3500,
      "lines": [
        "Loaded from an offset and a duration."
      ]
    },
    {
      "start": 4000,
      "end": 6500,
      "lines": [
        "A coarser clock spelling."
      ]
    },
    {
      "start": 7000,
      "end": 8480,
      "lines": [
        "Frames, at 25fps."
      ]
    },
    {
      "start": 9000,
      "end": 11000,
      "lines": [
        {
          "text": "Half-open and Tom &amp; Jerry.",
          "tags": [
            {
              "kind": "color",
              "start": 0,
              "end": 9,
              "value": "#FF0000"
            }
          ]
        }
      ]
    }
  ]
}

Gemengde regeleinden, losse spaties en een p-element zonder eigen begin komen in echte bestanden voor. Vergelijk dit met het nette voorbeeld hierboven.

Veelgestelde vragen

Wat gebeurt er met de TTML-proloog, de styling- en layout-tabellen in JSON?

Ze verdwijnen, met één precieze uitzondering. De XML-declaratie, de styling-tabel met benoemde stijlen, de layout-tabel met benoemde regio’s, metadata en de verwijzingen daarop komen niet in de JSON terecht; het styles-object blijft leeg. Opmaak binnen een p-element hoort bij de regel zelf en komt wel mee, in de tags-array.

Hoe ziet de JSON-uitvoer eruit als TTML daar naartoe gaat?

Als een object met version en een cues-array. Elke cue heeft start en end in milliseconden en een lines-array met de tekstregels; een id-veld heeft een cue niet.

Zijn de TTML-tijden exact in het JSON-bestand?

Ja, tot op de milliseconde — fijner kan geen van beide. TTML schrijft een moment als 00:00:04.126 en JSON als 4126; er wordt niets afgerond of verschoven, en een blok dat 2,9 seconden in beeld was, blijft dat.

Hoe komt een TTML-blok van twee regels in JSON terecht?

Als twee waarden in de lines-array onder dezelfde cue; de JSON verdeelt ze niet over twee cues, dus ze blijven één blok.

Blijft de volgorde van TTML-blokken in JSON gelijk?

Ja. De cues komen op volgorde van hun startmoment te staan, het vroegste eerst; een invoer die zelf niet op volgorde stond, wordt dus herschikt. Dat verandert de opbouw van het bestand en niet de woorden erin.

Kan ik JSON weer naar TTML omzetten?

Ja, met een eigen lijst: JSON naar TTML verliest karaoke. Die lijst wijkt af van de lijst hierboven omdat de twee formaten verschillende dingen vasthouden.

Blijft de tekencodering van het TTML-bestand in JSON behouden?

Nee. De uitvoer is UTF-8 met regeleinden zoals Unix ze schrijft en zonder byteordemarkering, ongeacht de invoer. Een TTML-bestand in UTF-16 of een Windows-codering wordt bij het inlezen omgezet; de JSON heeft daarna altijd dezelfde vorm.

Gerelateerde hulpmiddelen