Sous-titres décalés : mesurer l'écart et décaler un SRT d'un nombre exact de secondes
Publié le 05/08/2026 · 15 min de lecture · Outils pour développeurs
Daniel Okonkwo — Développeur front-end et rédacteur Tech chez OneKitly
Performance web · Formats de fichiers
Vérifié à partir de 4 sources
Mesure l'écart avant de décaler quoi que ce soit. Repère une réplique parfaitement identifiable près du début, note l'instant exact où elle est prononcée dans le lecteur, soustrais l'horodatage de début du sous-titre, et tu as l'écart en secondes — puis refaites la mesure près de la fin du film. Si les deux valeurs concordent, la piste porte un écart constant et un seul décalage corrige tout le fichier : colle le SRT, saisis l'écart en secondes (positif pour retarder, négatif pour avancer) et récupère le fichier corrigé. Si la seconde valeur est plus grande que la première, ce n'est pas un écart, c'est une dérive, et aucun décalage ne la corrigera. Une dérive signifie presque toujours un conflit de cadence. Une piste calée sur un master à 25 ips et lue sur un transfert à 23,976 ips — 23,976 valant exactement 24000/1001 — doit voir ses horodatages multipliés par 1,042708, et non déplacés : l'erreur croît de 2,5625 seconde par minute de projection, soit une seconde toutes les 23,4 secondes et 3 minutes 50,6 secondes sur une timeline de sous-titres de 90 minutes. Le couple plus doux, 24 contre 23,976 ou 30 contre 29,97, vaut exactement 1,001 — seulement 5,4 secondes sur les mêmes 90 minutes, ce qui explique qu'on le prenne pour un écart constant pendant la première demi-heure. Un comportement à connaître avant de saisir une valeur négative : un sous-titre entièrement repoussé avant zéro est retiré, pas aplati, et une ligne ambre au-dessus de la sortie compte combien sont partis. Un sous-titre à cheval sur zéro garde sa vraie fin et commence à 00:00:00,000. Cela rend aussi utilisable un grand décalage négatif pour couper une introduction : les sous-titres qui s'y trouvaient disparaissent, tout ce qui suit garde son espacement, et on te dit ce qui a été perdu.
Mesure l'écart en deux points au lieu de le deviner une fois. S'il est constant, un seul décalage corrige le fichier. S'il grandit, c'est un problème de cadence — 25 ips contre 23,976 dérive de 2,5625 seconde par minute — et aucun décalage ne le corrigera.
Mesure l'écart, ne l'estime pas à l'œil
Choisis une réplique impossible à confondre — un nom, un chiffre, un cri, n'importe quoi commençant par une consonne franche. Lance le film, mets en pause sur l'image où le son démarre, et lis l'horloge du lecteur. Retrouve ensuite cette même réplique dans le fichier de sous-titres et lis son horodatage de début. L'écart, c'est le temps vidéo moins le temps du sous-titre. Si la vidéo indique 00:04:12,500 et le sous-titre 00:04:09,000, les sous-titres passent 3,5 secondes trop tôt et l'écart à appliquer est de +3,5 secondes.
Recommence ensuite, aussi près de la fin du film que tu trouves une réplique nette. Cette seconde mesure constitue tout le diagnostic, et c'est en la sautant qu'on décale quatre fois le même fichier sans jamais le corriger. Deux nombres qui concordent à quelques dixièmes près signifient un écart constant : un décalage, terminé. Deux nombres qui diffèrent de plusieurs minutes signifient que le fichier n'est pas décalé du tout, il tourne à la mauvaise vitesse, et chaque décalage appliqué corrigera un bout du film en aggravant l'autre.
Une note pratique sur la lecture de l'horloge : la plupart des lecteurs affichent la position au dixième de seconde, et un dixième reste très en deçà de ce qu'un spectateur perçoit ; inutile donc de viser l'image près. Ce qu'il faut, c'est être honnête sur l'instant mesuré. Mesure l'instant où le son démarre, pas celui où tu le remarques, et mesure le même type d'instant les deux fois — sinon tes deux relevés diffèrent de ton temps de réaction et tu inventes une dérive qui n'existe pas.
Quand l'écart grandit : l'arithmétique des cadences
Le même film existe en deux familles de vitesse de défilement, et le fichier de sous-titres se souvient de celle sur laquelle il a été écrit. La famille cinéma tourne à 24 images par seconde, ou à 24000/1001 — 23,976 — sur tout transfert ayant dû tenir dans la cadence de la télévision couleur américaine. La famille diffusion de la plus grande partie de l'Europe tourne à 25. Ce ne sont pas des étiquettes décoratives : les abréviations de cadence de ffmpeg les écrivent en fractions exactes, film = 24/1, pal = 25/1, ntsc-film = 24000/1001, ntsc = 30000/1001. Un fichier de sous-titres fait pour l'une et lu sur l'autre n'est pas au mauvais endroit, il avance à la mauvaise vitesse.
La correction est une multiplication, pas une addition. Des horodatages écrits pour une version à 25 ips, lus sur une version à 23,976 ips, doivent être multipliés par 25 ÷ (24000/1001) = 25025/24000 = 1,042708. Lis cela comme un taux d'erreur et cela devient reconnaissable à l'œil : 2,5625 seconde de dérive par minute de projection, une seconde pleine toutes les 23,4 secondes. Sur une timeline de sous-titres de 90 minutes, cela s'accumule à 230,6 secondes — 3 minutes 50,6 secondes. Dans l'autre sens, une réplique qui appartient à la 90e minute du transfert à 23,976 porte un horodatage 25 ips de 86 minutes 18,8 secondes et arrive 3 minutes 41,2 secondes trop tôt.
Le couple dangereux est le petit. Passer de 24 à 23,976, ou de 30 à 29,97, correspond à un rapport d'exactement 1,001, soit 5,4 secondes sur les mêmes 90 minutes. Pendant les vingt premières minutes, c'est invisible ; à la dernière bobine, c'est une phrase entière à côté. On décale un tel fichier de deux secondes, on regarde le début avec satisfaction, et on retombe sur le même problème une heure plus tard — parce que ce n'était jamais un écart. Deux mesures espacées d'une heure te disent lequel des deux tu as en environ quatre-vingt-dix secondes de travail.
Cet outil décale et ne rééchelonne pas, et il vaut mieux le dire franchement que te laisser le découvrir. Si tes deux mesures divergent, le fichier a besoin que chaque horodatage soit multiplié, ce qui suppose un outil de conversion de cadence ou un court script — et le multiplicateur est le rapport de tes deux positions mesurées, pas une valeur à deviner. Divise le temps vidéo réel de la réplique tardive par celui de la réplique précoce, fais de même pour les deux horodatages des sous-titres ; le rapport de ces deux rapports est ce qu'il faut appliquer.
Ce que fait réellement un décalage négatif ici
Un décalage négatif est le cas courant — des sous-titres qui arrivent en retard doivent être avancés — et c'est le seul endroit où un outil de sous-titrage doit trancher une question que le format ne tranche pas pour lui. Un sous-titre à 00:00:01,000 décalé de −5 secondes commencerait à −4 secondes. SubRip n'a aucun moyen d'écrire cela. Trois réponses sont possibles : écrire quand même un horodatage négatif et laisser le lecteur s'étrangler, supprimer le sous-titre, ou le borner à zéro. Cet outil choisit entre les deux dernières, sous-titre par sous-titre, selon ce qui reste après l'origine.
Le test porte sur l'horodatage de fin du sous-titre, ce qui produit deux résultats différents. Un sous-titre à cheval sur zéro est tronqué : à −2,5 secondes, 00:00:01,000 --> 00:00:04,000 revient en 00:00:00,000 --> 00:00:01,500. Il garde sa vraie fin, apparaît donc dès la toute première image et dure une seconde et demie de moins qu'il ne devrait — visible, mais pas fatal. Un sous-titre entièrement repoussé avant zéro, c'est autre chose. À −5 secondes, le même sous-titre se terminerait à −1 seconde : il n'a plus rien à montrer, et il est retiré du fichier. Les sous-titres qui subsistent sont renumérotés à partir de 1, si bien que ce qui revient est un fichier plus court et non un fichier rembourré.
Repousse tout le fichier assez loin et les sous-titres compris dans cet intervalle disparaissent purement et simplement. Un décalage de −20 secondes appliqué à un fichier dont les trois premiers sous-titres tiennent dans les douze premières secondes ne renvoie plus rien, et une ligne ambre au-dessus de la sortie indique que tous les sous-titres tombent désormais avant zéro. En deçà de cet extrême, la même ligne porte deux comptes : combien de sous-titres ont été retirés, et combien commençaient avant zéro et démarrent maintenant à l'origine. Ce que l'outil ne fait plus, c'est perdre des sous-titres sans le dire — lis les comptes avant d'écraser quoi que ce soit, et compare-les à ce que tu pensais perdre.
Cela fait aussi d'un grand décalage négatif un véritable outil de coupe. Retire une introduction de trente secondes en tête de vidéo, décale les sous-titres de −30 secondes, et ceux qui appartenaient à l'introduction sont supprimés, celui qui chevauche la coupe commence à la première image avec sa vraie fin, et tout ce qui suit garde son espacement. Le compte affiché dans le bandeau sert de vérification : s'il annonce quatre sous-titres retirés alors que tu comptais en perdre deux, ton écart dépassait la durée de l'introduction.
Ce qui ressort, et ce que cela change discrètement
La sortie est toujours du SubRip, quelle que soit l'entrée. Les sous-titres sont renumérotés à partir de 1 dans l'ordre du fichier, les horodatages sont écrits en HH:MM:SS,mmm avec une virgule avant les millisecondes, et tout ce qui se trouve entre la ligne d'horodatage et la ligne vide passe tel quel — y compris tes balises d'italique ou tes tirets de dialogue. Ce dernier point compte : c'est un outil de recalage, pas de nettoyage, et il ne modifiera ton texte en rien.
Il lit aussi un fichier WebVTT, et cela vaut la peine d'être su, car le résultat n'est pas celui qu'un utilisateur non averti attend. Colle un .vtt : l'outil trouve les sous-titres, jette la ligne d'en-tête WEBVTT, jette les identifiants de repère et les réglages de repère placés après la flèche, convertit le point décimal en virgule, et te rend du SubRip. Les temps se décalent correctement. Mais le fichier qui revient n'est plus du WebVTT valide — l'en-tête est une exigence stricte de la spécification, et les réglages de positionnement sur lesquels tu comptais peut-être ont disparu. Si tu voulais un .vtt décalé, ce n'est pas la bonne voie.
Deux petits faits sur les bords, tous deux trouvés en réinjectant la sortie de l'outil dans l'outil. Le lecteur d'horodatage accepte jusqu'à trois chiffres pour le champ des heures : un horodatage comme 111:06:41,000 est donc relu sans difficulté, et le plafond se situe à 999:59:59,999, au-delà duquel l'outil écrirait des heures qu'il ne saurait plus relire — un mur qu'aucun film n'atteindra. Et l'écart est arrondi au millième de seconde en sortie : une valeur de 0,0005 seconde devient un déplacement d'une milliseconde plutôt que rien. Ni l'une ni l'autre ne gênera un film, mais les deux méritent d'être connues si tu enchaînes les opérations.
| Conflit | Multiplicateur à appliquer | Dérive par minute | Dérive sur 90 minutes | Ce que l'on voit à l'écran |
|---|---|---|---|---|
| Écart constant (toute cause) | 1,000000 — décale plutôt | 0 s | 0 s | Aussi faux à la 1re minute qu'à la 89e — un seul décalage corrige |
| Sous-titres 24 ips sur vidéo 23,976 ips (ou 30 sur 29,97) | 1,001000 | 0,060 s | 5,4 s | Invisible pendant vingt minutes, une phrase à côté à la fin — le cas le plus souvent mal diagnostiqué |
| Sous-titres 25 ips sur vidéo 24 ips | 1,041667 | 2,500 s | 3 min 45,0 s | Les sous-titres prennent de l'avance et l'écart se creuse visiblement dès la première bobine |
| Sous-titres 25 ips sur vidéo 23,976 ips | 1,042708 | 2,563 s | 3 min 50,6 s | Le classique conflit PAL-cinéma : une seconde perdue toutes les 23,4 secondes |
| Sous-titres 23,976 ips sur vidéo 25 ips | 0,959041 | −2,458 s | −3 min 41,2 s | Le même conflit à l'envers : les sous-titres prennent de plus en plus de retard |
Questions fréquentes
- Comment mesurer l'écart avec précision sans avancer image par image dans tout le film ?
- Deux mesures suffisent, et le dixième de seconde suffit comme précision. Trouve une réplique commençant par une consonne franche près du début du film, mets en pause sur l'image où le son démarre, lis la position du lecteur ; soustrais-en l'horodatage de début du sous-titre. Fais de même pour une réplique proche de la fin. Si les deux écarts concordent, applique leur moyenne et c'est terminé. La constance de la méthode compte plus que la précision : mesure toujours le même instant — le début du son, pas le moment où tu le reconnais — car une erreur de temps de réaction d'une demi-seconde sur l'une des deux mesures suffit à inventer une dérive inexistante. Si ton lecteur n'affiche que des secondes entières, prends-en un qui affiche les dixièmes : la différence entre 3 secondes et 3,5 secondes d'écart se voit à l'écran.
- Mes sous-titres sont parfaits au début et environ quatre minutes en avance à la fin. Qu'est-ce que c'est ?
- C'est un conflit de cadence, et son ampleur dit lequel. Environ quatre minutes de dérive sur un long métrage est la signature de sous-titres à 25 ips sur une vidéo à 23,976 ips : le multiplicateur vaut 1,042708, la dérive 2,5625 seconde par minute, et sur une timeline de sous-titres de 90 minutes elle totalise 230,6 secondes — 3 minutes 50,6 secondes, ou 3 minutes 41,2 secondes si tu la mesures plutôt sur l'horloge de la vidéo. Un décalage ne peut pas y remédier, car il ajoute le même nombre à chaque horodatage alors que ton erreur est proportionnelle à l'horodatage. Il faut multiplier chaque horodatage par 1,042708, ce qui relève de la conversion de cadence et non du décalage. Cet outil ne le fait pas, et appliquer un décalage ne fera que déplacer d'un bout du film à l'autre le point où les sous-titres tombent juste.
- Qu'arrive-t-il aux sous-titres qu'un décalage négatif repousse avant 00:00:00,000 ?
- Ils sont retirés, et l'outil dit combien. La décision se prend sur l'horodatage de fin, d'où deux résultats. Un sous-titre à cheval sur zéro garde sa vraie fin : décaler 00:00:01,000 --> 00:00:04,000 de −2,5 secondes renvoie 00:00:00,000 --> 00:00:01,500, qui s'affiche dès la première image et dure une seconde et demie de trop peu. Un sous-titre dont la fin est elle aussi passée avant zéro n'a plus rien à montrer et il est supprimé ; les survivants sont renumérotés à partir de 1, si bien que la sortie est un fichier valide plus court plutôt qu'un fichier rembourré d'entrées vides. Une ligne ambre au-dessus de la sortie porte les comptes — combien de sous-titres ont été retirés, combien démarrent maintenant à l'origine — et si le décalage efface tout, elle le dit au lieu de te remettre un fichier. Aucun temps négatif n'est jamais écrit. En pratique, cela fait d'un grand décalage négatif un moyen utilisable de couper une introduction : compare le nombre retiré au nombre de sous-titres que tu comptais perdre avant d'écraser quoi que ce soit.
- Puis-je y coller un fichier WebVTT, ou n'accepte-t-il que du SubRip ?
- Il lit le WebVTT, mais il te rend du SubRip, et cette conversion n'est pas gratuite. WebVTT est une spécification du W3C : le fichier doit s'ouvrir par une ligne WEBVTT, les horodatages utilisent un point avant la fraction à trois chiffres et non une virgule, le champ des heures est facultatif, et une ligne de repère peut porter une liste de réglages après la flèche — alignement, position, région — ainsi qu'un identifiant facultatif sur la ligne au-dessus. Cet outil trouve les repères, les décale et écrit du SubRip : l'en-tête a disparu, les identifiants ont disparu, les réglages ont disparu, et le point devient une virgule. Si ta source était un WebVTT stylé ou positionné, tout cela est jeté sans le dire. Si tu veux en réalité du texte brut à partir d'un fichier de sous-titres plutôt qu'un fichier recalé, le convertisseur VTT vers TXT est la voie honnête.
- Existe-t-il une spécification officielle SubRip pour vérifier mon fichier ?
- Non, et il vaut mieux le savoir avant de discuter avec un outil de ce qui est valide. Le format, c'est ce que produisait le programme SubRip d'origine, plus ce que les lecteurs ont ensuite bien voulu tolérer. La Bibliothèque du Congrès le décrit comme partiellement documenté et mal normalisé, et ne liste aucun document de spécification ; sa fiche donne la forme du timecode comme heures:minutes:secondes,millisecondes, avec la virgule, et la flèche comme deux tirets suivis d'un chevron fermant. Il n'existe pas non plus de type de média enregistré, là où WebVTT dispose de text/vtt enregistré auprès de l'IANA. En pratique, cela signifie que l'encodage relève de la devinette — le programme d'origine sortait par défaut dans une page de codes Windows, si bien que tout analyseur doit tenter une détection de jeu de caractères — et que lorsque deux outils divergent sur ton fichier, aucun des deux n'a tort au regard d'une norme. Teste dans le lecteur que tu utiliseras vraiment.
Articles qui pourraient t'intéresser
Tous les guides →Outils similaires
SubRip n'a pas de spécification. La Bibliothèque du Congrès le décrit comme partiellement documenté et mal normalisé : ce qui constitue un fichier .srt valide est donc décidé par le lecteur, l'encodeur ou la plateforme qui le lit, et deux d'entre eux finiront par diverger. Tout ce qui est décrit ici a été vérifié sur la sortie réelle de l'outil, pas sur une norme, puisque ce format n'en a aucune. WebVTT est différent — il dispose d'une spécification publiée par le W3C — mais celle-ci reste au stade de Candidate Recommendation Draft, et non de recommandation achevée. Conserve le fichier d'origine, teste le fichier converti dans le lecteur ou l'outil d'envoi que tu comptes vraiment utiliser avant de jeter quoi que ce soit, et considère toute affirmation sur ce que font « tous les lecteurs », y compris celles de cette page, comme quelque chose à vérifier sur le vôtre.
Sources
- 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
Tu as repéré une erreur dans cet article ?