Legendas dessincronizadas: medir o desvio e deslocar um SRT um número exato de segundos
Publicado a 05/08/2026 · 15 min de leitura · Ferramentas para programadores
Daniel Okonkwo — Programador front-end e redator de Tecnologia na OneKitly
Desempenho web · Formatos de ficheiro
Verificado a partir de 4 fontes
Meça o desvio antes de deslocar seja o que for. Encontre uma fala inconfundível perto do início, anote o instante exato em que é dita no leitor, subtraia a marca de início da legenda e tem o desvio em segundos — depois repita a medição perto do fim do filme. Se os dois números coincidirem, a faixa tem um desvio constante e um só deslocamento corrige o ficheiro inteiro: cole o SRT, introduza o desvio em segundos (positivo atrasa, negativo adianta) e recolha o ficheiro corrigido. Se o segundo número for maior do que o primeiro, não é um desvio, é uma deriva, e nenhum deslocamento a corrigirá. A deriva quase sempre significa um conflito de cadência. Uma faixa acertada por um master a 25 fps e lida sobre uma transferência a 23,976 fps — 23,976 é exatamente 24000/1001 — precisa que as suas marcas sejam multiplicadas por 1,042708, e não deslocadas: o erro cresce 2,5625 segundos por cada minuto de projeção, ou seja um segundo a cada 23,4 segundos e 3 minutos 50,6 segundos ao longo de uma linha de tempo de legendas de 90 minutos. O par mais suave, 24 contra 23,976 ou 30 contra 29,97, vale exatamente 1,001 — apenas 5,4 segundos nesses mesmos 90 minutos, e por isso é confundido com um desvio constante durante a primeira meia hora. Um comportamento a conhecer antes de escrever um valor negativo: uma legenda empurrada por completo para antes do zero é removida, não achatada, e uma linha âmbar por cima da saída conta quantas se foram. Uma legenda a cavalo do zero mantém o seu fim real e começa em 00:00:00,000. Isso torna também um deslocamento negativo grande numa forma viável de cortar uma introdução: as legendas que lá estavam desaparecem, tudo o que se segue mantém o espaçamento, e diz-se-lhe o que se perdeu.
Meça o desvio em dois pontos em vez de o adivinhar uma vez. Se for constante, um único deslocamento corrige o ficheiro. Se crescer, é um problema de cadência — 25 fps contra 23,976 deriva 2,5625 segundos por minuto — e nenhum deslocamento o corrigirá.
Meça o desvio, não o avalie a olho
Escolha uma fala que não possa confundir — um nome, um número, um grito, algo que comece por uma consoante nítida. Reproduza o filme, pause no fotograma em que o som começa e leia o relógio do leitor. Depois procure essa mesma fala no ficheiro de legendas e leia a sua marca de início. O desvio é o tempo do vídeo menos o tempo da legenda. Se o vídeo marca 00:04:12,500 e a legenda 00:04:09,000, as legendas passam 3,5 segundos adiantadas e o desvio a aplicar é de +3,5 segundos.
Agora faça-o uma segunda vez, tão perto do fim do filme quanto encontrar uma fala limpa. Esta segunda medição é todo o diagnóstico, e saltá-la é a razão pela qual se desloca quatro vezes o mesmo ficheiro sem nunca o corrigir. Dois números que coincidem a umas décimas significam desvio constante: um deslocamento e está feito. Dois números que diferem em minutos significam que o ficheiro não está desviado, está a correr à velocidade errada, e cada deslocamento corrigirá uma ponta do filme piorando a outra.
Uma nota prática sobre ler o relógio: a maioria dos leitores mostra a posição à décima de segundo, e uma décima fica muito abaixo do que um espectador nota, por isso aqui não é preciso rigor ao fotograma. O que é preciso é honestidade sobre que instante mediu. Meça o instante em que o som começa, não aquele em que dá por ele, e meça o mesmo tipo de instante das duas vezes — caso contrário as duas leituras diferem pelo seu tempo de reação e inventa uma deriva que não existe.
Quando o desvio cresce: a aritmética das cadências
O mesmo filme existe em duas famílias de velocidade, e o ficheiro de legendas lembra-se de contra qual foi escrito. A família de cinema anda a 24 fotogramas por segundo, ou a 24000/1001 — 23,976 — em qualquer transferência que tenha tido de caber na cadência da televisão a cores americana. A família de difusão de quase toda a Europa anda a 25. Não são etiquetas decorativas: as próprias abreviaturas de cadência do ffmpeg escrevem-nas como frações exatas, film = 24/1, pal = 25/1, ntsc-film = 24000/1001, ntsc = 30000/1001. Um ficheiro de legendas feito para uma e lido sobre a outra não está no sítio errado, anda à velocidade errada.
A correção é uma multiplicação, não uma soma. As marcas escritas para uma versão a 25 fps, lidas sobre uma versão a 23,976 fps, têm de ser multiplicadas por 25 ÷ (24000/1001) = 25025/24000 = 1,042708. Leia isso como uma taxa de erro e torna-se reconhecível à vista: 2,5625 segundos de deriva por minuto de projeção, um segundo inteiro a cada 23,4 segundos. Ao longo de uma linha de tempo de legendas de 90 minutos acumulam-se 230,6 segundos — 3 minutos 50,6 segundos. Ao contrário, uma fala que pertence ao minuto 90 da transferência a 23,976 leva uma marca de 25 fps de 86 minutos 18,8 segundos e aparece 3 minutos 41,2 segundos cedo demais.
O par perigoso é o pequeno. Passar de 24 para 23,976, ou de 30 para 29,97, é uma razão de exatamente 1,001, que sobre os mesmos 90 minutos dá 5,4 segundos. Nos primeiros vinte minutos é invisível; na última bobina é uma frase inteira fora do sítio. Desloca-se esse ficheiro dois segundos, vê-se o princípio com satisfação e uma hora depois volta o mesmo problema — porque nunca foi um desvio. Duas medições separadas por uma hora dizem-lhe qual dos dois tem em cerca de noventa segundos de trabalho.
Esta ferramenta desloca e não redimensiona, e é melhor dizê-lo com franqueza do que deixá-lo descobrir. Se as suas duas medições divergirem, o ficheiro precisa que cada marca seja multiplicada, o que implica uma ferramenta de conversão de cadência ou um script curto — e o multiplicador é a razão entre as suas duas posições medidas, não um valor a adivinhar. Divida o tempo real de vídeo da fala tardia pelo da fala inicial, faça o mesmo com as duas marcas de legenda; a razão entre essas duas razões é o que há a aplicar.
O que faz realmente aqui um deslocamento negativo
Um deslocamento negativo é o caso comum — legendas que chegam tarde têm de ser adiantadas — e é o único ponto em que uma ferramenta de legendas tem de decidir algo que o formato não decide por ela. Uma legenda em 00:00:01,000 deslocada −5 segundos começaria em −4 segundos. O SubRip não tem maneira de escrever isso. Há três respostas possíveis: escrever mesmo assim uma marca negativa e deixar o leitor engasgar-se, descartar a legenda, ou limitá-la a zero. Esta ferramenta escolhe entre as duas últimas, legenda a legenda, conforme o que sobra depois da origem.
O teste é feito sobre a marca de fim da legenda, o que produz dois resultados diferentes. Uma legenda a cavalo do zero fica truncada: a −2,5 segundos, 00:00:01,000 --> 00:00:04,000 volta como 00:00:00,000 --> 00:00:01,500. Mantém o seu fim real, portanto aparece logo no primeiro fotograma e dura um segundo e meio menos do que devia — visível, mas não fatal. Uma legenda empurrada por completo para antes do zero é outra coisa. A −5 segundos, essa mesma legenda acabaria a −1 segundo: não lhe resta nada para mostrar e é retirada do ficheiro. As legendas que sobrevivem são renumeradas a partir de 1, pelo que o que volta é um ficheiro mais curto e não um ficheiro recheado.
Empurre o ficheiro inteiro para trás o suficiente e as legendas contidas nesse troço desaparecem sem mais. Um deslocamento de −20 segundos aplicado a um ficheiro cujas três primeiras legendas cabem nos primeiros doze segundos já não devolve nada, e uma linha âmbar por cima da saída indica que todas as legendas ficam agora antes de zero. Aquém desse extremo, essa mesma linha leva duas contagens: quantas legendas foram removidas e quantas começavam antes de zero e passam a começar na origem. O que a ferramenta já não faz é perder legendas sem o dizer: leia as contagens antes de sobrescrever seja o que for e compare-as com o que esperava perder.
Isso faz também de um grande deslocamento negativo uma verdadeira ferramenta de corte. Retire uma introdução de trinta segundos do início de um vídeo, desloque as legendas −30 segundos, e as que pertenciam à introdução são removidas, a que fica a cavalo do corte começa no primeiro fotograma com o seu fim real, e tudo o que se segue mantém o espaçamento. A contagem no aviso é a verificação: se disser quatro legendas removidas e contava perder duas, o seu desvio ultrapassava a duração da introdução.
O que sai de volta, e o que muda em silêncio
A saída é sempre SubRip, entre o que entrar. As legendas são renumeradas a partir de 1 pela ordem do ficheiro, as marcas são escritas como HH:MM:SS,mmm com uma vírgula antes dos milissegundos, e tudo o que está entre a linha da marca e a linha em branco passa intacto — incluindo as suas etiquetas de itálico ou os travessões de diálogo. Este último ponto conta: isto é um reajustador de tempos, não um limpador, e não alterará o seu texto de forma nenhuma.
Também lê um ficheiro WebVTT, e vale a pena sabê-lo porque o resultado não é o que um utilizador desprevenido espera. Cole um .vtt: a ferramenta encontra as legendas, deita fora a linha de cabeçalho WEBVTT, deita fora os identificadores de legenda e quaisquer definições colocadas depois da seta, converte o ponto decimal em vírgula e devolve-lhe SubRip. Os tempos deslocam-se corretamente. Mas o ficheiro que volta já não é WebVTT válido — o cabeçalho é uma exigência estrita da especificação, e as definições de posicionamento em que talvez confiasse desapareceram. Se queria um .vtt deslocado, não é por aqui.
Dois pequenos factos sobre os limites, ambos encontrados dando à ferramenta a sua própria saída. O leitor de marcas aceita até três dígitos no campo das horas, por isso uma marca como 111:06:41,000 é relida sem problema; o teto fica em 999:59:59,999, para lá do qual a ferramenta escreveria horas que já não conseguiria reler — um muro que nenhum filme alcançará. E o desvio é arredondado a milissegundos inteiros na saída, de modo que um valor de 0,0005 segundos se torna um movimento de um milissegundo em vez de nada. Nenhum incomodará um filme, mas ambos merecem ser conhecidos se encadear operações.
| Conflito | Multiplicador a aplicar | Deriva por minuto | Deriva em 90 minutos | Como se vê a ver |
|---|---|---|---|---|
| Desvio constante (qualquer causa) | 1,000000 — desloque em vez disso | 0 s | 0 s | Igualmente errado no minuto 1 e no 89 — um só deslocamento corrige |
| Legendas a 24 fps sobre vídeo a 23,976 fps (ou 30 sobre 29,97) | 1,001000 | 0,060 s | 5,4 s | Invisível durante vinte minutos, uma frase fora do sítio no fim — o caso mais mal diagnosticado |
| Legendas a 25 fps sobre vídeo a 24 fps | 1,041667 | 2,500 s | 3 min 45,0 s | As legendas adiantam-se e a diferença abre-se logo na primeira bobina |
| Legendas a 25 fps sobre vídeo a 23,976 fps | 1,042708 | 2,563 s | 3 min 50,6 s | O clássico conflito PAL-cinema: um segundo perdido a cada 23,4 segundos |
| Legendas a 23,976 fps sobre vídeo a 25 fps | 0,959041 | −2,458 s | −3 min 41,2 s | O mesmo conflito ao contrário: as legendas atrasam-se cada vez mais |
Perguntas frequentes
- Como meço o desvio com precisão sem avançar fotograma a fotograma pelo filme todo?
- Duas medições chegam, e basta precisão à décima de segundo. Procure uma fala que comece por consoante nítida perto do início do filme, pause no fotograma em que o som começa e leia a posição do leitor; subtraia-lhe a marca de início da legenda. Faça o mesmo com uma fala perto do fim. Se os dois desvios coincidirem, aplique a sua média e está feito. Aqui a constância do método conta mais do que a precisão: meça sempre o mesmo instante — o começo do som, não o momento em que o reconhece —, porque um erro de tempo de reação de meio segundo numa das duas medições chega para inventar uma deriva inexistente. Se o seu leitor só mostra segundos inteiros, use um que mostre décimas: a diferença entre 3 e 3,5 segundos de desvio vê-se no ecrã.
- As minhas legendas estão perfeitas no início e cerca de quatro minutos adiantadas no fim. O que é isso?
- É um conflito de cadência, e a sua dimensão diz qual. Cerca de quatro minutos de deriva ao longo de uma longa-metragem é a assinatura de legendas a 25 fps sobre um vídeo a 23,976 fps: o multiplicador é 1,042708, a deriva 2,5625 segundos por minuto, e sobre uma linha de tempo de legendas de 90 minutos soma 230,6 segundos — 3 minutos 50,6 segundos, ou 3 minutos 41,2 segundos se a medir contra o relógio do vídeo. Um deslocamento não pode repará-lo, porque soma o mesmo número a cada marca ao passo que o seu erro é proporcional à marca. É preciso multiplicar cada marca por 1,042708, o que é conversão de cadência e não deslocamento temporal. Esta ferramenta não o faz, e aplicar um deslocamento só mudará de uma ponta do filme para a outra o ponto em que as legendas calham certas.
- O que acontece às legendas que um deslocamento negativo empurra para antes de 00:00:00,000?
- São removidas, e a ferramenta diz quantas. A decisão é tomada sobre a marca de fim, daí dois resultados. Uma legenda a cavalo do zero mantém o seu fim real: deslocar 00:00:01,000 --> 00:00:04,000 em −2,5 segundos devolve 00:00:00,000 --> 00:00:01,500, que aparece desde o primeiro fotograma e dura um segundo e meio a menos. Uma legenda cujo fim também passou para antes do zero não tem nada para mostrar e é descartada; as sobreviventes são renumeradas a partir de 1, pelo que a saída é um ficheiro válido mais curto e não um ficheiro recheado de entradas vazias. Uma linha âmbar por cima da saída leva as contagens — quantas legendas foram removidas, quantas passam a começar na origem — e, se o deslocamento apagar tudo, di-lo em vez de lhe entregar um ficheiro. Nunca são escritos tempos negativos. Na prática, isto faz de um grande deslocamento negativo uma forma utilizável de cortar uma introdução: compare o número removido com as legendas que contava perder antes de sobrescrever seja o que for.
- Posso colar um ficheiro WebVTT, ou só aceita SubRip?
- Lê WebVTT, mas devolve-lhe SubRip, e essa conversão não é gratuita. O WebVTT é uma especificação do W3C: o ficheiro tem de abrir com uma linha WEBVTT, as marcas usam um ponto antes da fração de três dígitos e não uma vírgula, o campo das horas é opcional, e uma linha de tempos pode levar uma lista de definições depois da seta — alinhamento, posição, região — além de um identificador opcional na linha de cima. Esta ferramenta encontra os tempos, desloca-os e escreve SubRip: o cabeçalho desaparece, os identificadores desaparecem, as definições desaparecem e o ponto passa a vírgula. Se a sua origem era WebVTT com estilo ou posicionado, tudo isso é descartado sem aviso. Se o que quer na verdade é texto simples a partir de um ficheiro de legendas e não um ficheiro reajustado, o conversor de VTT para TXT é a via honesta.
- Existe uma especificação oficial do SubRip com que possa verificar o meu ficheiro?
- Não, e vale a pena sabê-lo antes de discutir com uma ferramenta sobre o que é válido. O formato é aquilo que o programa SubRip original produzia, mais aquilo que os leitores depois decidiram tolerar. A Biblioteca do Congresso descreve-o como parcialmente documentado e mal normalizado, e não lista qualquer documento de especificação; a sua ficha dá a forma do código de tempo como horas:minutos:segundos,milissegundos, com a vírgula, e a seta como dois hífenes e um sinal de maior. Também não existe um tipo de media registado, ao passo que o WebVTT tem text/vtt registado na IANA. Na prática, isto significa que a codificação é um palpite — o programa original saía por omissão numa página de códigos Windows, pelo que qualquer analisador tem de tentar detetar o conjunto de carateres — e que quando duas ferramentas divergem sobre o seu ficheiro, nenhuma está errada face a uma norma. Teste no leitor que vai mesmo usar.
Artigos que podem interessar-lhe
Todos os guias →Ferramentas relacionadas
O SubRip não tem especificação. A Biblioteca do Congresso descreve-o como parcialmente documentado e mal normalizado, portanto o que conta como ficheiro .srt válido é decidido pelo leitor, pelo codificador ou pela plataforma que o lê, e dois deles acabarão por divergir. Tudo o que aqui se descreve foi verificado na saída real da ferramenta e não numa norma, porque este formato não tem nenhuma. O WebVTT é diferente — tem uma especificação publicada pelo W3C — mas continua a ser um Candidate Recommendation Draft e não uma recomendação concluída. Guarde o ficheiro original, teste o ficheiro convertido no leitor ou no serviço de envio que tenciona mesmo usar antes de deitar fora o que quer que seja, e trate qualquer afirmação sobre o que fazem «todos os leitores», incluindo as desta página, como algo a confirmar no seu.
Fontes
- Library of Congress — Sustainability of Digital Formats, format description FDD000569, SubRip Subtitle format (SRT): records the format as "Partial documented" and "not well standardized", lists no specification document, gives the timecode as hours:minutes:seconds,milliseconds (00:00:00,000) and the separator as two hyphens plus a right angle bracket, and notes that SRT has no character-encoding standard so a parser must attempt charset detection
- W3C — WebVTT: The Web Video Text Tracks Format, Candidate Recommendation Draft of 20 May 2026 — the file must begin with the string WEBVTT after an optional byte order mark, the timestamp fraction is separated by a U+002E FULL STOP and carries three digits, the hours component is optional and takes two or more digits, and a cue timings line may be followed by a cue settings list
- FFmpeg — ffmpeg-utils documentation, "Video rate" section: the exact rational values behind the named rates — film = 24/1, pal = 25/1, ntsc-film = 24000/1001, ntsc = 30000/1001 — which are the numbers the drift arithmetic in this article is computed from
- IANA — Media type registration for text/vtt, registered 14 October 2019 with the W3C WebVTT specification as its reference — the contrast with SubRip, which has no registered media type
Detetaste um erro neste artigo?