Estrarre i sottotitoli da un video
La prima esecuzione scarica il motore dei sottotitoli: circa 31 MB, serviti da questo sito e poi messi in cache dal browser. Il video stesso non lascia mai questa scheda.
Questa pagina prende un file video e restituisce le tracce di sottotitoli che sono già al suo interno, un file per traccia, chiamato come la lingua della traccia. Un file Matroska con una traccia SDH inglese, una traccia cinese e una traccia PGS esce come tre file: un .srt, un altro .srt e un .sup. Il contenitore viene demuxato, non ricodificato, quindi una traccia di testo viene copiata come i byte che erano già nel file: non ribattuta da uno schermo, non ritemporizzata.
Il lavoro avviene nella scheda. Il video viene letto da una build di ffmpeg compilata in WebAssembly che il sito serve da solo, e l’unica richiesta di rete è quella per il motore: circa 31 MB la prima volta che usi la pagina, poi memorizzati nella cache del browser. Il video non viene mai inviato da nessuna parte, la stessa regola di ogni altra pagina del sito e il motivo per cui questa si può usare su materiale che non può lasciare la macchina. I sottotitoli impressi nell’immagine non si possono estrarre, e nessuno strumento può farlo, perché non c’è una traccia da leggere: quelle parole sono pixel. Se il file non ha alcun flusso di sottotitoli, la pagina lo dice invece di produrre un file vuoto, e questo comprende il caso degli impressi: un video con sottotitoli visibili e nessuna traccia di sottotitoli viene segnalato come privo di contenuto da estrarre.
La pagina elenca ogni flusso di sottotitoli che trova prima di scrivere qualcosa: indice, codec, lingua, titolo e se il flusso è marcato predefinito o forzato. Le tracce che vivono già in un contenitore proprio mantengono il proprio formato — ASS resta ASS, WebVTT resta WebVTT — perché convertirle qui in SRT perderebbe la formattazione in silenzio, e perdere formattazione senza che nessuno lo chieda è l’unica cosa che questo sito non fa. Una traccia il cui codec non ha un contenitore autonomo (per esempio la traccia mov_text dentro un MP4) viene ricodificata in SRT, e la scheda del risultato lo dice invece di lasciarla passare per una copia. Le tracce bitmap escono come immagini, non come testo: un flusso PGS diventa un .sup e un flusso DVD diventa un .sub. È voluto: l’immagine è ciò che era nel file, e indovinarne il testo è un lavoro separato con una pagina propria e una propria domanda sulla lingua. L’annullamento ferma l’estrazione in corso e termina il worker che la esegue, quindi un file grande non tiene occupato un core dopo che hai deciso di non aspettare; l’elemento torna in uno stato da cui puoi riprovare e la corsa successiva avvia un worker nuovo, perché un file di sottotitoli scritto a metà che sembra completo è peggio di nessun file.
Domande frequenti
Quali contenitori video posso trascinare?
MKV, MP4, M4V, AVI, MOV, TS, WebM, WMV, FLV, MPG e OGV. L’elenco è in realtà un elenco dei demuxer presenti nella build di ffmpeg inclusa, non un elenco di codec video: qualunque cosa ci sia dentro il contenitore, le tracce di sottotitoli sono lo stesso tipo di flusso. Un file con un’estensione insolita ma un corpo Matroska normale di solito funziona lo stesso, perché il demuxer legge l’intestazione e non il nome; un download frammentato o incompleto spesso no, perché non c’è un indice da percorrere.
Il video lascia il mio computer mentre viene letto?
No. L’unico download è il motore ffmpeg, circa 31 MB, servito da questo sito e memorizzato dal browser dopo il primo uso. Il tuo video viene montato nel file system virtuale del motore dentro la scheda e letto da lì; non finisce mai in un corpo di richiesta. Puoi verificarlo nel pannello Rete: mentre un file viene elaborato non c’è alcuna richiesta che lo trasporti. È proprio questa proprietà il motivo per cui la pagina esiste: la maggior parte degli estrattori carica prima, e il materiale sotto vincolo legale o medico non si può caricare.
Perché ho ottenuto un file .sup invece di un .srt?
Perché quella traccia è memorizzata come immagini, non come testo. I flussi PGS (codec hdmv_pgs_subtitle) sono una sequenza di immagini, e l’estrazione onesta di un flusso di immagini è un flusso di immagini: un .sup, esattamente quello che lettori ed editor di sottotitoli si aspettano. Trasformarlo in testo significa riconoscere le lettere in ogni immagine, che è una pagina diversa, con una domanda sulla lingua e un passaggio di rilettura. L’estrattore non inventa mai testo che non ha letto.
Che cosa fa lo strumento con una traccia il cui formato non ha un file autonomo?
Ricodifica quella sola traccia in SRT e segnala il risultato come ricodificato. Il caso comune è mov_text, il codec dei sottotitoli che vive dentro gli MP4: non ha un formato di file proprio, quindi copiare il flusso produrrebbe byte che nessuno saprebbe aprire. La ricodifica non è senza perdite — la formattazione e il posizionamento che mov_text può portare non sopravvivono — perciò la scheda del risultato la elenca come perdita invece di presentare il file come copia intatta di ciò che era nel contenitore.
Come vengono chiamati i file di uscita quando le tracce sono più di una?
Con il nome del video e il codice di lingua della traccia: un file chiamato documentario.mkv con una traccia inglese dà documentario.eng.srt. Quando due tracce condividono la lingua — una traccia inglese normale e una SDH inglese, cosa comune — la seconda diventa documentario.eng-2.srt invece di sovrascrivere la prima. Una traccia senza etichetta di lingua ripiega sul suo indice di flusso, così resta distinguibile. Se ottieni più di un file, la pagina li offre come un unico zip, perché i browser bloccano una pagina che avvia più download insieme.
Perché la prima esecuzione richiede più tempo della seconda?
La prima esecuzione scarica il motore ffmpeg, circa 31 MB. La riga di avanzamento copre quel download e poi l’estrazione stessa. Il browser memorizza il motore, quindi le esecuzioni successive sulla stessa pagina partono quasi subito; lo stesso vale dopo un ricaricamento se la cache non è stata svuotata. Il motore è servito in quattro pezzi perché la piattaforma di hosting rifiuta i file singoli oltre 25 MiB, e la pagina li ricompone in memoria prima di partire: anche quella ricomposizione fa parte della stessa attesa iniziale.
Posso annullare un’esecuzione che sta impiegando troppo?
Sì. Il pulsante di annullamento interrompe l’estrazione in corso e termina il worker che la esegue, così un file grande non tiene occupato un core dopo che hai deciso di non aspettare. Annullare non è un errore: l’elemento torna in uno stato da cui puoi riprovare e la corsa successiva avvia un worker nuovo. Niente di parziale viene offerto come download, perché un file di sottotitoli scritto a metà che sembra completo è peggio di nessun file.