DVD titulky do TXT – oprava časování SRT titulků

Převod titulků z DVD – The Never-ending Story

Tak jsem tu zas :o) Při převodu titulků do TXT z DVD “Černý Jestřáb sestřelen [Black Hawk Down]” jsem narazil na velminepříjemný problém – titulky se časově překrývaly, tedy následující titulek začínal dříve, než předchozí skončil. To máza následek vypadávání těch titulků, které začínají moc brzo. Zkusil jsem titulky převést ještě pod windowsy za pomocíSubRipu a výsledek se mi zdál ještě horší. Navíc se mi úplně rozjela synchronizace titulků s obrazem resp. zvukem,když jsem použil formát SUB (MicroDVD). Takže jsem se vrátil k SRT formátu a jal se ručně hledat místa, kde se vyskytovalyproblémy. Po chvíli mě to přestalo bavit (už mi z těch tisíců řádků přecházel zrak) a tak jsem se rozhodnul pokusit senaprogramovat něco, co by tuhle špinavou práci za mě udělalo pohodlněji, rychleji a přesněji.


Výsledek vám zde nabízím. Je to prográmek v Turbo Pascalu 7.0 – nekamenujte mě, tohle jsem se naučil ještě na gymplu a odté doby jsem neměl čas upgradovat :o)) Program jsem vytvářel v TP 7.0 pro MS-DOS, v Linuxu jsem ho pak jen mírně upravil (týká se tojen 3 míst, kde se mapují soubory příkazem assign) a zkompiloval pomocí Free Pascal Compileru (součást distribuceMandrakeLinuxu). Ke stažení máte následující soubory:

  • srtcheck.linux.src.pas – zdrojový kód pro kompilaci v Linuxu pomocí fpc
  • srtcheck – binární kód (spustitelný program) – kompilováno v MandrakeLinuxu 9.0 pomocí balíčku fpc-1.0.4-2mdk
  • srtcheck.pas – původní zdroják pod windows
  • srtcheck.exe – spustitelný program pro platformu MS Windows
  • Jestrab.srt – ukázkový soubor s vadnými titulky

Nejdřív uvedu obecné komunikační projevy programu a pak se zastavím jednotlivě u specifik pro oba operační systémy. Výpisyprogramu v konzoli budu uvádět jen z Linuxu.

Program se spouští bez jakýchkoliv parametrů, názvy souborů se zadávají až v něm; v Linuxu nelze tudíž využít výpomociklávesy TAB. Nejprve se program zeptá na název souboru titulků, který chcete zkontrolovat a případně pak také opravit.V Linuxu dbejte na rozdíl mezi malými a velkými písmeny. Ve Windows je přípustných max. 8 znaků v názvu, tečka a přípona jsounepovinné (tečka je povinná jen u nově vytvářeného souboru) – tedy pokud nejsou v názvu souboru.
Soubor musí být ve stejném adresáři jako program. Při nenalezení souboru program skončí s hlášením Runtime error – nezdržovaljsem se ošetřením neexistence souborů.

V prvním kroku program prověří, zda jsou řádky zakončovány ve stylu Windows (CR-LF tedy 2 bajty 13 a 10), nebo jako v Linuxupouze bajtem 10. O tomto vás taky informuje hlášením. Tuhle pasáž jsem do programu přidal pro případ jeho provozováníve Windows – ty si totiž na linuxáckém zakončení řádků vylámou zuby :o) tedy pokud se týká použitých procedur v tomtoprogramu (readln). Jestliže jste ve Windows a program zahlásí ‘Zakonceni radku ve stylu LINUX’, pak nepokračujtev jeho provádění a převeďte titulky ze znakové stránky ISO-8859-2 do CP-1250. V Linuxu je to jedno, ten si poradí s obojím,výsledkem bude soubor ve formátu ISO-8859-2 a tak se nezalekněte menší délky souboru oproti původnímu, pokud byl v CP-1250.

   $ ./srtcheck   Zadej nazev souboru [v aktualnim adresari]: Jestrab.titulky.srt   Zakonceni radku je ve stylu WINDOWS   Mam pokracovat? [a/n]: A

Když tedy na dotaz odpovíte ano, nastupuje druhá fáze. Dochází k ověřování správnosti časování titulků, resp. testování,zda se konec předcházejícího titulku nepřekrývá se začátkem toho následujícího. Tady jsem se upnul na SRT formáttitulků tak, jak vzejdou po použití programu dvdsub (vizmůj předchozí článek), například:

100:00:07,000 --> 00:00:12,050"Podle skutečných událostí" 200:00:15,000 --> 00:00:19,539"Jedině mrtví se dočkali konce války." 300:00:20,000 --> 00:00:22,539Platón

Program hledá sekvenci znaků --> na pozici 14 v řádku. Jakmile jej najde, je z prvního titulku převeden čas ukončenítitulku na číslo v sekundách a z následujícího titulku čas jeho začátku. Tyto dva časy se porovnají a pokud je čas konceprvního titulku menší než čas začátku druhého, je vše v pořádku a pokračuje se porovnáváním druhého a třetího titulku atak dále až ke konci souboru. Pokud textový formát času nemá přesně podobu XX:XX:XX,XXX a není na přesných místech jakov uvedeném případě (čas začátku titulku začíná na pozici 1 na řádku a čas konce titulku na pozici 18), pak programzahlásí chybu:

   číslo_titulku-chyba ve formatu casu!

a jeho běh se ukončí. Nezbývá, než se do souboru titulků podívat a zjistit, kde je chyba. Ale při použití programudvdsub by k tomu nemělo nikdy dojít.

Program vypisuje za každý nalezený titulek tečku (jejich počet a pořadí vůči vypisovaným číslům titulků není úplněpřesné, o to mi nešlo, má to být jakýsi ukazatel průběhu). V případě, že narazí na titulek s délkou menšínež 0,2 sekundy, pak vypíše číslo_titulku-spatna delka titulku! Takovýto titulek musíte opravit ručně. V případěpřekryvu titulků vypíše jejich čísla, přičemž opravit je potřeba ten druhý. Tady máme krátkou ukázku:

   .....4-spatna delka titulku!...7-spatna delka titulku!.....   ...........................................................   ...........................................................   ............................158-159....   Casovani titulku se prekyva, celkem chyb: 3

Po překontrolování celého souboru program vypíše celkový počet chyb, které nalezl, a zeptá se, zda má provést takéopravu u špatně načasovaných titulků:

   Mam se pokusit o opravu casovani titulku? [a/n]: a   Zadej nazev noveho souboru: Jestrab.titulky.nove.srt

Při potvrzení se soubor titulků začne prohledávat znovu tak, jak je uvedeno výše,s tím, že nalezené chyby se opraví. Tady jsem si vymyslelsvoje pravidla pro opravu načasování titulku. Když předchozí titulek končí čárkou, pomlčkou či středníkem, paknásledující titulek začne za 0,2 sekundy co ten předchozí končí. Tady poznámku – prakticky se ukázalo, že v ukončenítitulků se problémy nevyskytují, pouze v jejich začátcích. Proto je pevným bodem konec předchozího titulku a upravuje sezačátek následujícího. Když je titulek na více než jeden řádek, je jeho délka nastavena (začátek posunut oproti konci) na 4 sekundy. Pokud má titulek jen jeden řádek a má méně než 10 znaků, pak je jeho délka nastavena na 1,5 sekundy, jinakna 2,8 sekundy. Po nastavení délky titulku – posunutí jeho začátku vůči konci – se opět zkontroluje, zda se nový začáteknepřekrývá s koncem předcházejícího titulku. Pokud ano, je začátek nastaven na 0,2 sekundy po konci předešlého titulku.Je zde opět použito teček k zobrazení průběhu. Poté, co program opraví celý soubor, vypíše:

   Kontroluji po sobe:

a proběhne celý první krok kontroly titulků, tentokráte už na novém opraveném souboru. Zbylé chyby už musíte opravit ručně -mělo by se jednat jen o titulky, jejichž délka je nulová či záporná (resp. menší než 0,2 sec, jak jsem psal už výše).

Snad vám tenhle prográmek ušetří práci a zkvalitní převod DVD na CD.

3 komentáře

  1. hanus | 05.06.2003 | 12:14 | Odpovědět

    Trošičku jsem změnil zadávání souborů pro Linux. Teď se zadává jako parametr z příkazové řádky. Nový zdroják a binárku najdete na mojí stránce

  2. hanus | 11.06.2003 | 15:39 | Odpovědět

    Tak jsem teď potřeboval rozdělit film s titulky na dvě CD. AVI jsem rozdělil v pohodě, ale s titulky jsem narazil na problém. Tak jsem z SRTCHECK odvodil SRTSHIFT :o)) Najdete to na http://hanus.host.sk/linux/tit_srt2.htm.

  3. hanus | 14.07.2003 | 15:54 | Odpovědět

    Zdokonalená verze pro Perl (srtcheck+srtshift+další funkce) je k dispozici na
    http://hanus.host.sk/linux/srtrepar.htm

Leave a comment

Sorry, you must be logged in to post a comment. Login