Przejdź do treści
SubtitleMatrix

Format napisów TTML

Co potrafi wyrazić ten format

Formatowanie tekstu
Czcionki, kolor, obrys, cień
Pozycja na ekranie
Tak
Czasy karaoke
Nie
Podziały wierszy w bloku
Tak
Oś czasu
Czas początku i końca dla każdego bloku
Dokładność czasów
1 ms
Czasy zapisane jako numery klatek
Nie
Tekst od prawej do lewej
Tak

Przykłady

Typowy plik TTML i to, co z niego czytamy

Plik

<?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>

Co zawiera

2 cues, 3 lines of text

  00:00:01.000 → 00:00:03.500
    Hello there.   [italic ×1]
    [region="bottom" style="s1"]
  00:00:03.500 → 00:00:06.000
    How are you?
    Fine, thanks.
    [region="bottom"]

Outside the cues:
  prolog     an XML declaration and the namespace bindings, kept as they came in
  styling    1 × <style> — "s1", the colour and weight a paragraph points at by name
  layout     1 × <region> — "bottom", the origin and extent a paragraph points at by name
  resolved   the head is kept as it was written and is not applied here — a paragraph's style="s1" region="bottom" stays an attribute, not a colour or a screen position

Prawa kolumna to nie przekonwertowany plik, tylko to, co ta strona odczytuje z lewej — i od czego zaczyna się każda konwersja tego pliku.

Trudny plik TTML i to, co mimo to z niego czytamy

Plik

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="http://www.w3.org/ns/ttml" xmlns:tts="http://www.w3.org/ns/ttml#styling">
  <body>
    <div begin="00:00:01.000" end="00:00:05.000">
      <p>Inherits its timing from the div, which we do not resolve.</p>
      <p begin="00:00:06.000" end="00:00:07.000">This one has its own timing.</p>
    </div>
    <!-- <p begin="00:00:08.000" end="00:00:09.000">commented out</p> -->
    <div>
      <p begin="00:00:10.000"/>
      <p begin="00:00:11.000" end="00:00:12.000">Last one.</p>
    </div>
  </body>
</tt>

Co zawiera

3 cues, 2 lines of text

  00:00:06.000 → 00:00:07.000
    This one has its own timing.
  00:00:10.000 → 00:00:12.000
    (no text)
  00:00:11.000 → 00:00:12.000
    Last one.

Outside the cues:
  prolog     an XML declaration and the namespace bindings, kept as they came in
  head       none — no <styling> and no <layout>, and no paragraph points at one either
  comments   the commented-out <p> stays a comment, in the place it was written
  divs       the timings on an enclosing <div> are not pushed down onto the paragraphs inside it

Reported while reading — repaired or skipped, never silently:
  1 × paragraphs with no readable begin time of their own (they were skipped — see the note about timing inherited from an enclosing div)
  1 × paragraphs with neither an end time nor a duration of their own (their end times were generated)

Prawdziwe pliki przychodzą ze znacznikiem BOM, windowsowymi końcami wierszy, zbłąkaną linią przed znacznikiem czasu albo znacznikiem, którego nie da się odczytać. Nic nie rzuca wyjątku: to, czego nie da się zrozumieć, jest raportowane, a nie po cichu gubione.

Konwertuj TTML (Timed Text) na inny format

Każda z nich działa w całości w Twojej przeglądarce. Etykiety mówią, ile kosztuje dany kierunek, zanim go otworzysz.

TTML → LRC: traci znaczniki czasu, styl, pozycję, precyzję i treść formatu.
  • Czasy
  • Formatowanie
  • Pozycjonowanie
  • Dokładność
  • Treści specyficzne dla formatu

Konwersja do tego formatu

TTML (Timed Text) to jeden z formatów napisów obsługiwanych przez tę stronę, a ta strona jest jego opisem: co potrafi przechować, czego nie potrafi i gdzie przekonwertować go dalej.

Powyższa tabela mówi wszystko — nie ma żadnej ukrytej listy funkcji. Gdy wiersz mówi „nie”, dokładnie to ginie przy konwersji do TTML, i każda strona konwersji linkowana poniżej mówi o tym, zanim otworzysz plik.

Każda z tych konwersji działa w Twojej przeglądarce. Nic nie jest wysyłane i nie potrzebujesz konta, co ma znaczenie przy materiałach objętych NDA, dokumentacją medyczną czy embargiem emisyjnym.

Częste pytania

Czym jest plik TTML?

`.ttml` to TTML, format tekstu synchronizowanego, w którym świat emisji i streamingu zapisuje napisy: dokument XML, którego `<head>` deklaruje nazwane style i regiony, a elementy `<p>` są napisami. Korzystają z niego pipeline'y napisów streamingowych, a profile SMPTE-TT i IMSC są na nim zbudowane.

Czy TTML przechowuje styl?

Tak, i więcej niż pozostałe formaty: tabelę stylów z krojami, rozmiarami, kolorami, obrysami i marginesami oraz znaczniki wewnątrz tekstu, więc jedna linia może być pogrubiona, kolorowa i umieszczona bez nazwanego stylu. Karaoke nie jest przechowywane: plik TTML mówi, kiedy blok się zaczyna i kończy, a nie kiedy zapala się sylaba. W praktyce `<styling>` trzyma style nazwane (`tts:color`, `tts:fontWeight`, `tts:fontFamily`), a `<layout>` regiony (`tts:origin`, `tts:extent`); `<p>` wskazuje je po nazwie (`style="s1" region="bottom"`).

Czy każdy blok TTML ma zarówno początek, jak i koniec?

Tak, a moment w pliku TTML zapisuje się jako `00:00:04.126`. To najdrobniejsza jednostka TTML — milisekunda — i wartość jest dokładna, więc blok może być krótki, długi albo nachodzić na następny bez żadnych ukrytych założeń.

Na jaki format najlepiej przekonwertować TTML?

Nic na tej stronie nie przechowa wszystkiego, co mieści plik TTML, więc nie ma kierunku bezstratnego — każda strona konwersji wymienia własną listę strat. Wybierz format docelowy po tym, z którą listą umiesz żyć, a nie po tym, który format widziałeś najczęściej.

Co plik TTML trzyma poza blokami napisów?

Deklarację XML i cały `<head>`: tabelę `<styling>` z nazwanymi stylami (`tts:color`, `tts:fontWeight`), tabelę `<layout>` z nazwanymi regionami (`tts:origin`, `tts:extent`) oraz ewentualne `<metadata>`. Elementy `<p>` odwołują się do nich po nazwie zamiast powtarzać definicje, więc zmianą jednego wpisu można przestylizować wszystkie napisy. Te odwołania leżą poza modelem bloku, dlatego konwersja do formatu bez nich raportuje stratę.