Konwerter napisów TTML na JSON
Albo wklej tekst napisów
Co zmienia ta konwersja
1 rzecz zostaje pominięta albo wymaga decyzji
- Treści specyficzne dla formatu
treść, którą format źródłowy trzyma poza blokami (bloki niebędące napisami, tekst nagłówka, ustawienia pojedynczych bloków, zakomentowane zdarzenia) — format docelowy nie ma dla niej miejsca
Ta lista pochodzi z macierzy możliwości tych dwóch formatów, a nie z konkretnego wczytanego pliku. Konkretny plik może stracić więcej, jeśli używa cech, które format dopuszcza, ale macierz ich nie modeluje.
Ta strona konwertuje TTML na JSON. Wrzuć plik albo wklej tekst, a dostaniesz z powrotem wersję JSON. Konwersja odbywa się w całości w Twojej przeglądarce — nic nie jest wysyłane i nie potrzebujesz konta.
Te dwa formaty nie przechowują tego samego, a różnica nie jest kosmetyczna: konstrukcje charakterystyczne dla formatu nie mają gdzie się podziać w JSON. Powyższa lista wynika z tego, co potrafi wyrazić każdy z formatów, a nie z zawartości Twojego pliku — więc odpowiedź jest taka sama, zanim cokolwiek wczytasz.
Jeden plik to żaden problem, podobnie cały sezon: kolejka przetwarza je po kolei, a wyniki pobierasz razem w jednym archiwum ZIP.
Przykłady
Typowy plik TTML po konwersji do JSON
Wejście
<?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>
Wynik
{
"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."
]
}
]
}
W tym wyniku przepada: konstrukcje charakterystyczne dla formatu. Reszta zgadza się linia w linię.
Ta sama konwersja na trudniejszym pliku
Wejście
<?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 & Jerry.</p>
</div>
</body>
</tt>
Wynik
{
"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 & Jerry.",
"tags": [
{
"kind": "color",
"start": 0,
"end": 9,
"value": "#FF0000"
}
]
}
]
}
]
}
To typowe uszkodzenia prawdziwych plików — mieszane końce wierszy, zbłąkane spacje, puste pola. Porównaj z uporządkowanym przykładem powyżej, żeby zobaczyć, co parser wybacza.
Częste pytania
Co dzieje się z prologiem TTML oraz tabelami `<styling>` i `<layout>` w JSON-ie?
Przepadają, z jednym dokładnym wyjątkiem: formatowanie zapisane wewnątrz akapitu, np. `<span tts:fontStyle="italic">`, jest częścią linii i trafia do tablicy `tags` jako obiekt z polem `kind`. Deklaracja XML, style nazwane (`tts:color`, `tts:fontWeight`) i regiony (`tts:origin`, `tts:extent`) nie są tłumaczone na żadne pole wyniku — dokument wynikowy ma tylko `version` i `cues`, bez `styles`.
Jak wygląda wynik, gdy TTML zamienia się w JSON?
Jak dokument z `version` oraz tablicą `cues`, w której każdy blok ma `start` i `end` w milisekundach oraz tablicę `lines`. Blok TTML bez atrybutu `xml:id` nie ma identyfikatora, więc w wyniku nie pojawia się pole `id`; jeśli plik go zawiera, identyfikator trafia do JSON-a. Każdy blok TTML daje jeden obiekt w `cues`, w tej samej kolejności.
Czy czasy z TTML są dokładne w JSON-ie?
Tak, co do milisekundy. TTML zapisuje moment jako `00:00:04.126`, a JSON jako liczbę całkowitą `4126`; nic nie jest zaokrąglane ani przesuwane, a blok trwający 2,9 sekundy nadal ma `end` o 2900 ms dalej niż `start`.
Jak dwuwierszowy blok TTML zapisuje się w JSON-ie?
Jako dwa elementy tablicy `lines` w jednym obiekcie cue. Para zostaje zachowana, bo oba wiersze nadal należą do jednego bloku, a odtwarzacz lub skrypt czyta je razem.
Czy JSON zachowuje kolejność bloków TTML?
Tak, po sortowaniu po czasie `start`. Tablica `cues` idzie od najwcześniejszego bloku, więc plik TTML z zaburzoną kolejnością zostanie uporządkowany; to zmiana struktury, nie treści.
Czy można wrócić z JSON-a do TTML?
Tak, ale to inny kierunek: konwersja JSON na TTML traci karaoke, bo TTML nie zapisuje momentów wewnątrz linii. Lista strat różni się od tej powyżej, bo oba formaty przechowują odmienne rzeczy.
Czy JSON zachowuje kodowanie pliku TTML?
Nie. Wynik jest zawsze w UTF-8, z końcami LF i bez BOM, niezależnie od kodowania źródła. Plik w UTF-16 lub w kodowaniu jednobajtowym jest dekodowany przy wczytaniu, co panel wyniku odnotowuje.