Décalez le minutage de sous-titres SRT en millisecondes
Le minutage des sous-titres peut présenter une avance ou un retard constant alors que chaque bloc est correct.
Lancer gratuitement
Cet outil décale un fichier SRT complet selon une valeur signée en millisecondes, sans réécrire les textes ni modifier leur ordre. Une valeur positive retarde les sous-titres ; une valeur négative les avance. Tout horodatage qui deviendrait négatif est ramené à zéro. L’analyseur contrôle chaque bloc numéroté et signale les horodatages mal formés au lieu de produire silencieusement un fichier endommagé.
Choisissez le décalage à partir d’un repère fiable
Repérez d’abord un événement net vers le début de la vidéo : une porte qui se ferme, le commencement d’une phrase ou l’apparition d’un titre. Comparez cet événement au sous-titre correspondant et mesurez l’écart en millisecondes. Si le texte apparaît avant l’événement, choisissez une valeur positive pour le retarder. S’il apparaît après, choisissez une valeur négative pour l’avancer. Vérifiez également un point proche de la fin avant d’appliquer la correction à l’ensemble. Lorsque l’écart reste constant, un décalage unique convient. S’il augmente progressivement, il s’agit probablement d’une dérive de lecture ou d’une conversion de fréquence d’images qu’un déplacement constant ne peut pas corriger. Envoyez le texte SRT complet et l’entier signé. Le résultat conserve la numérotation et les lignes, tout en remplaçant chaque plage horaire valide. Enregistrez-le sous un nouveau nom `.srt`, puis comparez-le à l’original avant de remplacer un fichier utilisé en production.
Comprenez la validation et le plancher à zéro
Chaque bloc SRT doit comporter un index numérique, une ligne de minutage et au moins une ligne de texte. Les valeurs horaires suivent la forme standard `heures:minutes:secondes,millisecondes`, avec au moins deux chiffres pour les heures, deux pour les minutes et les secondes, et exactement trois pour les millisecondes. Les minutes et secondes doivent être comprises entre zéro et cinquante-neuf. L’outil refuse un bloc si sa ligne ne respecte pas cette structure, si l’un des horodatages est incorrect ou si la fin d’origine précède le début. Ce contrôle strict évite une transformation partielle qui semblerait réussie tout en dissimulant des blocs cassés. Une valeur négative est appliquée séparément aux deux bornes. Tout résultat inférieur à zéro devient exactement `00:00:00,000`. Un bloc entièrement antérieur à un grand décalage négatif peut donc se réduire à une durée nulle au début. C’est le comportement prévu, non une erreur de calcul. Contrôlez les premiers blocs après une forte avance.
Intégrez prudemment le fichier décalé à votre flux
Conservez le fichier original et donnez un autre nom au résultat tant que vous ne l’avez pas vérifié avec la bonne vidéo. Contrôlez des dialogues, des passages musicaux et des changements de scène à plusieurs endroits, plutôt qu’un seul bloc initial. L’opération ne modifie que les horodatages : elle ne traduit pas le texte, ne renumérote pas les blocs, ne corrige pas l’orthographe, ne crée pas les sous-titres manquants et ne compense aucune dérive. Les sauts de ligne internes sont préservés, de sorte que la disposition des sous-titres multilignes reste intacte. Le résultat normalise les fins de ligne et sépare régulièrement les blocs, selon un format accepté par les lecteurs SRT courants. L’algorithme étant déterministe et sans réseau, hasard ni modèle, une même entrée avec une même valeur donne toujours une sortie identique. Vous pouvez l’utiliser dans le navigateur ou par API pour $0.002 par requête. Pour les traitements en série, associez le décalage à la version exacte du montage.
Cas d’usage
Corriger un retard audio constant
Retardez tous les sous-titres lorsqu’un réglage de multiplexage ou de lecture les fait apparaître avant les paroles.
Compenser une introduction supprimée
Avancez tous les blocs après le retrait d’une amorce, d’un compte à rebours ou d’un générique de durée fixe.
Normaliser un fichier de livraison
Appliquez un décalage éditorial mesuré et obtenez un minutage SRT homogène avant la préparation d’une publication.
Questions fréquentes
Faut-il choisir une valeur positive ou négative ?
Choisissez une valeur positive pour afficher les sous-titres plus tard et une valeur négative pour les afficher plus tôt.
Que devient un horodatage décalé sous zéro ?
La borne concernée est ramenée à `00:00:00,000` ; aucun temps négatif n’est produit.
Cet outil corrige-t-il la dérive des sous-titres ?
Non. Une valeur constante corrige un écart constant. Un écart croissant nécessite une correction de vitesse ou d’images.
Le texte ou la numérotation changent-ils ?
Non. Les numéros et les lignes sont conservés ; seuls les temps sont remplacés, tandis que les fins de ligne et les séparations sont normalisées.
Que se passe-t-il si un bloc comporte un temps invalide ?
La requête entière échoue avec une erreur d’entrée qui désigne le bloc concerné ; aucun fichier partiel n’est renvoyé.
Quel est le prix d’une requête API ?
Le tarif de l’API est de $0.002 par requête. La même opération déterministe est aussi proposée dans le navigateur.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/video/subtitle-srt-shift \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"srt":"1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.","offset_ms":-1500}'const res = await fetch("https://api.kit.forhosting.com/video/subtitle-srt-shift", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/video/subtitle-srt-shift",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/video/subtitle-srt-shift", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"srt":"1\\n00:00:01,250 --> 00:00:03,500\\nOpening line.\\n\\n2\\n00:00:05,000 --> 00:00:07,250\\nSecond line.","offset_ms":-1500}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"srt":"1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.","offset_ms":-1500}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/video/subtitle-srt-shift", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"srt": "1\n00:00:01,250 --> 00:00:03,500\nOpening line.\n\n2\n00:00:05,000 --> 00:00:07,250\nSecond line.",
"offset_ms": -1500
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.subtitle_srt_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |