Sposti i tempi dei sottotitoli SRT in millisecondi
La temporizzazione dei sottotitoli può risultare sempre anticipata o ritardata anche quando ogni singolo blocco è corretto.
Esegui gratis nel browser
Questo strumento sposta un intero file SRT con un unico valore con segno, espresso in millisecondi, senza riscrivere le battute né cambiarne l’ordine. I valori positivi ritardano i sottotitoli; quelli negativi li anticipano. Ogni timestamp che diventerebbe negativo viene limitato a zero. Il parser convalida ciascun blocco numerato e segnala i timestamp malformati invece di restituire silenziosamente un file danneggiato.
Scelga lo spostamento da un punto di sincronizzazione affidabile
Individui anzitutto un evento chiaro vicino all’inizio del video, per esempio una porta che si chiude, l’avvio di una frase o la comparsa di un titolo. Confronti quell’evento con il sottotitolo corrispondente e misuri la differenza in millisecondi. Se il sottotitolo compare prima dell’evento, usi un valore positivo per ritardarlo. Se compare dopo, usi un valore negativo per anticiparlo. Prima di confermare una modifica globale, ripeta il controllo verso la fine del programma. Quando la differenza resta costante, un solo spostamento è la correzione adatta. Quando cresce nel tempo, è probabile che vi siano una deriva di riproduzione o una conversione della frequenza dei fotogrammi, problemi che uno spostamento costante non risolve. Invii il testo SRT completo e l’intero con segno. Il risultato conserva numeri e righe delle didascalie, sostituendo tutti gli intervalli validi. Lo salvi come nuovo file `.srt` e lo confronti con l’originale prima di sostituire materiali di produzione.
Comprenda la convalida e il limite a zero
Ogni blocco SRT deve contenere un indice numerico, una riga temporale e almeno una riga di testo. I valori usano il formato standard `ore:minuti:secondi,millisecondi`, con due o più cifre per le ore, due per minuti e secondi ed esattamente tre per i millisecondi. Minuti e secondi devono essere compresi tra zero e cinquantanove. Lo strumento rifiuta un blocco se la riga non rispetta questa struttura, se uno dei timestamp è malformato oppure se la fine originale precede l’inizio. Questo comportamento rigoroso impedisce trasformazioni parziali che sembrano riuscite ma nascondono blocchi danneggiati. Un valore negativo viene applicato separatamente ai due estremi. Se un risultato scende sotto zero, diventa esattamente `00:00:00,000`. Di conseguenza, un blocco interamente precedente all’entità di un grande spostamento negativo può ridursi a durata zero all’inizio. È il limite previsto, non un errore aritmetico. Controlli i primi blocchi dopo un forte anticipo.
Usi con cautela il file spostato nel flusso di lavoro
Conservi il file originale e salvi il risultato con un nome diverso finché non lo avrà controllato sul video corretto. Verifichi dialoghi, musica e cambi di scena in più punti, senza affidarsi soltanto a un blocco iniziale. L’operazione cambia esclusivamente i timestamp: non traduce il testo, non rinumera i blocchi, non corregge l’ortografia, non inventa sottotitoli mancanti e non compensa la deriva. Le interruzioni di riga nelle didascalie restano intatte, quindi i sottotitoli su più righe mantengono la disposizione prevista. Il risultato normalizza i fine riga e separa i blocchi in modo uniforme, compatibile con i comuni lettori SRT. Poiché l’algoritmo è deterministico e non utilizza rete, casualità o modelli, gli stessi dati e lo stesso valore producono sempre un risultato identico. Può eseguirlo nel browser oppure automatizzarlo tramite API al costo di $0.002 per richiesta. Nei processi in serie, registri lo spostamento insieme alla versione esatta del video.
Casi d'uso
Correggere un ritardo audio costante
Ritardi tutti i sottotitoli quando un’impostazione di multiplexing o riproduzione li mostra prima del parlato.
Compensare un’introduzione rimossa
Anticipi ogni blocco dopo la rimozione di una sigla, un conto alla rovescia o una sequenza iniziale di durata fissa.
Normalizzare un file di consegna
Applichi una correzione editoriale misurata e ottenga tempi SRT uniformi prima di preparare i sottotitoli per la pubblicazione.
Domande frequenti
Devo usare uno spostamento positivo o negativo?
Usi un valore positivo per mostrare i sottotitoli più tardi e uno negativo per mostrarli prima.
Che cosa accade se un timestamp scende sotto zero?
Quel limite iniziale o finale viene portato a `00:00:00,000`; non viene mai generato un tempo negativo.
Questo strumento corregge la deriva dei sottotitoli?
No. Un valore costante corregge una differenza costante. Una differenza crescente richiede una correzione di velocità o fotogrammi.
Il testo o la numerazione cambiano?
No. Numeri e righe restano invariati; vengono sostituiti solo i tempi e normalizzati i fine riga e gli spazi fra blocchi.
Che cosa succede se un blocco contiene un tempo non valido?
L’intera richiesta termina con un errore di input che identifica il blocco interessato; non viene restituito un file parziale.
Quanto costa una richiesta API?
Il prezzo dell’API è $0.002 per richiesta. La stessa operazione deterministica è disponibile anche nel browser.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"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
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.subtitle_srt_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |