Extrair legendas do vídeo
A primeira execução baixa o motor de legendas — cerca de 31 MB, servidos por este site e em cache no navegador depois disso. O vídeo em si nunca sai desta aba.
Esta página pega um arquivo de vídeo e devolve as faixas de legendas que já estão dentro dele, um arquivo por faixa, nomeado segundo o idioma da faixa. Um arquivo Matroska com uma faixa de SDH em inglês, uma faixa em chinês e uma faixa de imagem PGS sai como três arquivos: um .srt, outro .srt e um .sup. O contêiner é demultiplexado, não recodificado, então uma faixa de texto é copiada como os bytes que já estavam no arquivo — não redigitada a partir de uma tela, não recronometrada.
O trabalho acontece na aba. O vídeo é lido por uma compilação do ffmpeg compilado para WebAssembly que este site serve sozinho, e a única requisição de rede é para esse motor: cerca de 31 MB na primeira vez que você usa a página, guardados em cache pelo navegador depois. O vídeo em si nunca é enviado a lugar nenhum, que é a regra que todas as outras páginas daqui seguem e a razão de esta poder ser usada com material que não pode sair da máquina.
Legendas queimadas na imagem não podem ser extraídas, e nenhuma ferramenta consegue, porque não há faixa para ler — essas palavras são pixels. Se o arquivo não tiver stream de legendas nenhum, a página diz isso em vez de produzir um arquivo vazio, e isso inclui o caso das queimadas: um vídeo com legendas visíveis e nenhuma faixa de legendas será reportado como não tendo nada a extrair.
A página lista cada stream de legendas que encontra antes de escrever qualquer coisa: índice, codec, idioma, título e se o stream está marcado como padrão ou forçado. Faixas que já vivem em contêiner próprio mantêm o próprio formato — ASS continua ASS, WebVTT continua WebVTT —, porque convertê-las para SRT aqui descartaria estilo silenciosamente, e descartar estilo sem que ninguém peça é a única coisa que este site não faz. Uma faixa cujo codec não tem contêiner autônomo (a faixa mov_text dentro de um MP4, por exemplo) é recodificada para SRT, e o cartão de resultado diz isso em vez de deixá-la passar como cópia.
Faixas em bitmap saem como imagens, não como texto: um stream PGS vira um .sup e um stream de DVD vira um .sub. Isso é deliberado — a imagem é o que estava no arquivo, e adivinhar o texto dela é outro trabalho, com página própria e a própria pergunta de idioma. Leve o .sup à página de PGS se você precisa de texto.
Perguntas frequentes
Quais contêineres de vídeo eu posso soltar na extração de legendas?
MKV, MP4, M4V, AVI, MOV, TS, WebM, WMV, FLV, MPG e OGV. A lista é na verdade uma lista de demultiplexadores que a compilação incluída do ffmpeg tem, não uma lista de codecs de vídeo: seja o que for que esteja dentro do contêiner, as faixas de legendas são o mesmo tipo de stream. Um arquivo com extensão incomum mas corpo Matroska normal geralmente ainda funciona, porque o demultiplexador lê o cabeçalho e não o nome; um download fragmentado ou incompleto muitas vezes não, porque não há índice para percorrer.
O vídeo sai do meu computador durante a extração de legendas?
Não. O único download é o próprio motor ffmpeg, cerca de 31 MB, servido por este site e guardado em cache pelo navegador depois do primeiro uso. O seu vídeo é montado no sistema de arquivos virtual do motor dentro da aba e lido dali; ele nunca é escrito em um corpo de requisição. Você pode confirmar no painel Network: enquanto um arquivo é processado não há requisição carregando-o. Essa propriedade é a razão de a página existir — a maioria dos extratores envia primeiro, e material sob retenção jurídica ou médica não pode ser enviado.
Por que eu recebi um arquivo .sup em vez de um .srt na extração de legendas?
Porque aquela faixa está guardada como imagens, não como texto. Streams PGS (codec hdmv_pgs_subtitle) são uma sequência de imagens, e a extração honesta de um stream de imagem é um stream de imagem: um .sup, que é exatamente o que players e editores de legendas esperam. Transformá-lo em texto significa reconhecer as letras de cada imagem, o que é outra página, com uma pergunta de idioma e uma etapa de revisão. O extrator nunca inventa texto que não leu.
O que a ferramenta faz com uma faixa cujo formato não tem arquivo autônomo?
Ela recodifica essa faixa para SRT e marca o resultado como recodificado. O caso comum é o mov_text, o codec de legendas que vive dentro de MP4: ele não tem formato de arquivo próprio, então copiar o stream produziria bytes que nada conseguiria abrir. Recodificar não é sem perdas — estilo e posicionamento que o mov_text possa carregar não sobrevivem —, então o cartão de resultado registra isso como perda em vez de apresentar o arquivo como cópia intocada do que estava no contêiner.
Como os arquivos de saída da extração são nomeados quando há várias faixas?
Pelo nome do próprio vídeo e pelo código de idioma da faixa: um arquivo chamado documentary.mkv com uma faixa em inglês dá documentary.eng.srt. Quando duas faixas compartilham um idioma — uma faixa normal em inglês e uma faixa de SDH em inglês, o que é comum —, a segunda vira documentary.eng-2.srt em vez de sobrescrever a primeira. Uma faixa sem etiqueta de idioma cai para o índice do stream, então continua distinguível. Se você receber mais de um arquivo, a página os oferece como um único zip, porque os navegadores bloqueiam uma página que dispara vários downloads ao mesmo tempo.
Por que a primeira execução da extração de legendas demora mais que a segunda?
A primeira execução baixa o motor ffmpeg, cerca de 31 MB. A linha de progresso cobre esse download e depois a extração em si. O navegador guarda o motor em cache, então execuções seguintes na mesma página começam quase imediatamente; o mesmo vale depois de recarregar, se o cache não tiver sido limpo. O motor é servido em quatro pedaços porque a plataforma de hospedagem recusa arquivos individuais acima de 25 MiB, e a página os junta na memória antes de começar — essa remontagem faz parte da mesma espera da primeira execução.
Posso cancelar uma extração de legendas que está demorando demais?
Sim. O botão de cancelar interrompe a extração em curso e encerra o worker que a está fazendo, então um arquivo grande não continua ocupando um núcleo depois que você decidiu não esperar. Cancelar não é erro: o item volta a um estado de onde você pode tentar de novo, e a execução seguinte começa um worker novo. Nada parcial é oferecido como download, porque um arquivo de legendas pela metade com aparência de completo é pior do que nenhum arquivo.