Ondertitels uit video halen
De eerste run downloadt de ondertitel-engine — ongeveer 31 MB, door deze site geleverd en daarna door de browser gecachet. De video zelf verlaat dit tabblad nooit.
Deze pagina neemt een videobestand en geeft je de ondertiteltracks terug die er al in zitten, één bestand per track, genoemd naar de taal van de track. Een Matroska-bestand met een Engelse SDH-track, een Chinese track en een PGS-beeldtrack komt eruit als drie bestanden: een .srt, nog een .srt en een .sup. De container wordt gedemultiplext in plaats van opnieuw gecodeerd, dus een teksttrack wordt gekopieerd als de bytes die al in het bestand zaten — niet opnieuw getypt vanaf een scherm en niet opnieuw getimed.
Het werk gebeurt in de tab. De video wordt gelezen door een build van ffmpeg die naar WebAssembly is gecompileerd en die deze site zelf serveert; het enige netwerkverzoek is dat van de engine, ongeveer 31 MB de eerste keer dat je de pagina gebruikt en daarna door de browser gecacht. De video zelf wordt nergens naartoe gestuurd, dezelfde regel die elke andere pagina hier volgt en de reden dat deze bruikbaar is voor materiaal dat de machine niet mag verlaten.
Ondertitels die in het beeld zijn ingebakken kunnen niet worden geëxtraheerd, en geen enkele tool kan dat, want er is geen track om te lezen — die woorden zijn pixels. Heeft het bestand helemaal geen ondertitelstroom, dan zegt de pagina dat in plaats van een leeg bestand te maken, en dat geldt ook voor het ingebakken geval: een video met zichtbare ondertitels en zonder ondertiteltrack wordt gemeld als niets om te extraheren.
De pagina laat elke gevonden ondertitelstroom zien voordat ze iets schrijft: index, codec, taal, titel en of de stroom als default of forced is gemarkeerd. Tracks die al in hun eigen container leven houden hun eigen formaat — ASS blijft ASS, WebVTT blijft WebVTT — omdat ze hier naar SRT omzetten stilzwijgend opmaak zou laten vallen, en opmaak laten vallen zonder dat iemand erom vroeg is het enige dat deze site niet doet. Een track waarvan de codec geen losse container heeft (de mov_text-track in een MP4 bijvoorbeeld) wordt naar SRT hercodeerd, en de resultaatkaart zegt dat in plaats van het als kopie te laten passeren.
Bitmaptracks komen er als beelden uit, niet als tekst: een PGS-stroom wordt een .sup en een DVD-stroom een .sub. Dat is met opzet — het beeld is wat er in het bestand zat, en naar de tekst ervan raden is een aparte klus met een eigen pagina en een eigen taalvraag. Neem de .sup mee naar de PGS-pagina als je tekst nodig hebt.
Veelgestelde vragen
Welke videocontainers kan ik erin slepen?
MKV, MP4, M4V, AVI, MOV, TS, WebM, WMV, FLV, MPG en OGV. Die lijst is in feite een lijst demuxers die de meegeleverde ffmpeg-build heeft, geen lijst videocodecs: wat er ook in de container zit, de ondertiteltracks zijn hetzelfde soort stroom. Een bestand met een ongewone extensie maar een normale Matroska-body werkt meestal nog, omdat de demuxer de header leest en niet de naam; een gefragmenteerde of onvolledige download vaak niet, omdat er geen index is om door te lopen.
Verlaat de video mijn computer terwijl hij wordt gelezen?
Nee. De enige download is de ffmpeg-engine zelf, ongeveer 31 MB, geserveerd vanaf deze site en na het eerste gebruik door de browser gecacht. Je video wordt in het virtuele bestandssysteem van de engine in de tab gemount en van daaruit gelezen; hij wordt nooit in een verzoekbody geschreven. Je kunt dit controleren in het netwerkpaneel: terwijl een bestand wordt verwerkt is er geen verzoek dat het draagt. Die eigenschap is de reden dat de pagina bestaat — de meeste extractors uploaden eerst, en materiaal met een juridische of medische status mag niet worden geüpload.
Waarom kreeg ik een .sup-bestand in plaats van een .srt?
Omdat die track als beelden is opgeslagen, niet als tekst. PGS-stromen (codec hdmv_pgs_subtitle) zijn een reeks afbeeldingen, en de eerlijke extractie van een beeldstroom is een beeldstroom: een .sup, precies wat spelers en ondertiteleditors verwachten. Er tekst van maken betekent de letters in elke afbeelding herkennen, wat een andere pagina is met een taalvraag en een proefleesstap. De extractor verzint nooit tekst die hij niet heeft gelezen.
Wat doet de tool met een track waarvan het formaat geen los bestand heeft?
Ze hercodeert die ene track naar SRT en markeert het resultaat als hercodeerd. Het gebruikelijke geval is mov_text, de ondertitelcodec die in MP4 leeft: die heeft geen eigen bestandsformaat, dus de stroom kopiëren zou bytes opleveren die niets kan openen. Hercoderen is niet verliesvrij — opmaak en positionering die mov_text kan dragen overleven niet — dus noemt de resultaatkaart het een verlies in plaats van het bestand te presenteren als een onaangeroerde kopie van wat er in de container zat.
Hoe worden de uitvoerbestanden genoemd als er meerdere tracks zijn?
Naar de eigen naam van de video en de taalcode van de track: een bestand dat documentaire.mkv heet met een Engelse track geeft documentaire.eng.srt. Wanneer twee tracks dezelfde taal delen — een normale Engelse track en een Engelse SDH-track, wat vaak voorkomt — wordt de tweede documentaire.eng-2.srt in plaats van de eerste te overschrijven. Een track zonder taaltag valt terug op zijn stroomindex, zodat hij nog steeds te onderscheiden is. Krijg je meer dan één bestand, dan biedt de pagina ze als één zip aan, omdat browsers een pagina blokkeren die meerdere downloads tegelijk start.
Waarom duurt de eerste run langer dan de tweede?
De eerste run downloadt de ffmpeg-engine, ongeveer 31 MB. De voortgangsregel dekt die download en daarna de extractie zelf. De browser cachet de engine, dus latere runs op dezelfde pagina beginnen bijna meteen; hetzelfde geldt na een herlaadbeurt als de cache niet is gewist. De engine wordt in vier stukken geserveerd omdat het hostingplatform losse bestanden boven 25 MiB weigert, en de pagina zet ze in het geheugen in elkaar voordat ze begint — dat samenvoegen valt onder dezelfde wachttijd bij de eerste run.
Kan ik een run annuleren die te lang duurt?
Ja. De annuleerknop stopt de lopende extractie en beëindigt de worker die hem uitvoert, zodat een groot bestand geen core bezet houdt nadat je hebt besloten niet te wachten. Annuleren is geen fout: het item gaat terug naar een staat van waaruit je opnieuw kunt proberen, en de volgende run start een nieuwe worker. Niets half afgemaakts wordt als download aangeboden, want een half geschreven ondertitelbestand dat compleet lijkt is erger dan geen bestand.