Desplace los tiempos de subtítulos SRT en milisegundos
La sincronización de los subtítulos puede adelantarse o retrasarse de forma constante aunque cada entrada sea correcta.
Ejecutar — gratis
Esta herramienta desplaza un archivo SRT completo mediante un único ajuste con signo, medido en milisegundos, sin reescribir los textos ni cambiar su orden. Los valores positivos retrasan los subtítulos y los negativos los adelantan. Toda marca que quedaría por debajo de cero se limita a cero. El analizador valida cada entrada numerada y notifica las marcas de tiempo incorrectas en lugar de devolver un archivo dañado.
Elija el ajuste desde un punto de sincronización fiable
Busque primero un acontecimiento claro cerca del inicio del vídeo, como el cierre de una puerta, el comienzo de una frase o la aparición de un título. Compare ese instante con la entrada correspondiente y mida la diferencia en milisegundos. Si el subtítulo aparece antes, introduzca un ajuste positivo para retrasarlo. Si aparece después, use un ajuste negativo para adelantarlo. Compruebe también un punto próximo al final antes de aplicar el cambio global. Si la diferencia permanece constante, un solo ajuste resolverá el problema. Si aumenta con el tiempo, probablemente existe una deriva de reproducción o una conversión de fotogramas que no se corrige con un desplazamiento constante. Envíe el texto SRT completo y un entero con signo. El resultado conserva la numeración y las líneas, pero sustituye todas las marcas válidas. Guárdelo como un archivo `.srt` nuevo y compárelo con el original antes de reemplazar materiales de producción.
Comprenda la validación y el límite en cero
Cada entrada SRT debe incluir un índice numérico, una línea de tiempos y al menos una línea de texto. Los tiempos siguen el formato estándar `horas:minutos:segundos,milisegundos`: dos o más dígitos para las horas, dos para minutos y segundos, y exactamente tres para milisegundos. Los minutos y segundos deben estar entre cero y cincuenta y nueve. La herramienta rechaza una entrada si la línea no respeta esa estructura, si una marca es incorrecta o si el final original precede al inicio. Esta validación estricta evita transformaciones parciales que aparentan funcionar mientras ocultan entradas rotas. Un ajuste negativo se aplica por separado a ambos extremos. Si un resultado es menor que cero, se convierte exactamente en `00:00:00,000`. Por ello, una entrada situada completamente antes de un ajuste negativo grande puede quedar reducida a duración cero al principio. Es el límite previsto, no un error aritmético. Revise las primeras entradas tras un adelanto considerable.
Use el archivo desplazado de forma segura
Conserve el archivo original y guarde el resultado con otro nombre hasta comprobarlo con el vídeo correcto. Revise diálogos, música y cambios de escena en varios puntos, no solo una entrada inicial. La operación modifica exclusivamente las marcas de tiempo: no traduce, renumera, corrige la ortografía, inventa entradas ausentes ni compensa una deriva progresiva. Los saltos de línea del texto se mantienen, por lo que los subtítulos multilínea conservan su disposición. El resultado normaliza los finales de línea y separa los bloques de manera uniforme, compatible con los consumidores habituales de SRT. Como el algoritmo es determinista y no usa red, azar ni modelos, la misma entrada y el mismo ajuste siempre producen idéntica salida. Puede ejecutarlo en el navegador o automatizarlo mediante la API por $0.002 por solicitud. En procesos por lotes, registre el ajuste junto a la versión del vídeo, pues una corrección creada para un montaje puede fallar si otro incluye una cabecera, publicidad o una claqueta distinta.
Qué puede hacer con ella
Corregir un retraso constante del audio
Retrase todos los subtítulos cuando una multiplexación o reproducción haga que aparezcan antes que la voz.
Compensar una introducción eliminada
Adelante todas las entradas tras quitar del vídeo una cabecera, una cuenta atrás o una secuencia de título de duración fija.
Normalizar un archivo de entrega
Aplique un ajuste editorial medido y obtenga tiempos SRT uniformes antes de empaquetar los subtítulos para una publicación.
Preguntas frecuentes
¿Debo usar un ajuste positivo o negativo?
Use un valor positivo para mostrar los subtítulos más tarde y uno negativo para mostrarlos antes.
¿Qué ocurre si una marca queda por debajo de cero?
Ese inicio o final se limita a `00:00:00,000`; nunca se genera un tiempo negativo.
¿Corrige esta herramienta la deriva de subtítulos?
No. Un ajuste constante corrige una diferencia constante. Si la diferencia crece durante el vídeo, hace falta corregir la velocidad o los fotogramas.
¿Cambian el texto o la numeración?
No. Se conservan los números y las líneas; solo se sustituyen los tiempos, mientras se normalizan los finales de línea y los espacios entre bloques.
¿Qué ocurre si una entrada tiene un tiempo no válido?
La solicitud completa falla con un error de entrada no válida que identifica la entrada afectada; no se devuelve un archivo parcial.
¿Cuánto cuesta una solicitud de API?
El precio de la API es $0.002 por solicitud. La misma operación determinista también está disponible en el navegador.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su 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)Ejemplo de solicitud
{
"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
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.subtitle_srt_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Límites
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |