SRT-Untertitelzeiten um Millisekunden verschieben
Untertitel können durchgehend zu früh oder zu spät erscheinen, obwohl jeder einzelne Eintrag in sich korrekt ist.
Im Browser ausführen – kostenlos
Dieses Werkzeug verschiebt eine vollständige SRT-Datei um einen vorzeichenbehafteten Millisekundenwert, ohne Texte umzuschreiben oder deren Reihenfolge zu ändern. Positive Werte zeigen Untertitel später an, negative Werte früher. Jeder Zeitstempel, der negativ würde, wird auf null begrenzt. Der Parser prüft jeden nummerierten Block und meldet fehlerhafte Zeitangaben, anstatt unbemerkt eine beschädigte Untertiteldatei auszugeben.
Bestimmen Sie den Versatz an einem zuverlässigen Bezugspunkt
Suchen Sie zunächst nahe dem Videoanfang nach einem eindeutigen Ereignis, etwa einer zufallenden Tür, dem Beginn eines Satzes oder dem Erscheinen eines Titels. Vergleichen Sie dieses Ereignis mit dem zugehörigen Untertitel und messen Sie die Differenz in Millisekunden. Erscheint der Untertitel vor dem Ereignis, verwenden Sie einen positiven Wert, um ihn nach hinten zu verschieben. Erscheint er danach, wählen Sie einen negativen Wert für eine frühere Anzeige. Prüfen Sie vor der globalen Änderung zusätzlich einen Punkt nahe dem Programmende. Bleibt die Differenz konstant, ist ein einziger Versatz die richtige Korrektur. Wächst sie mit der Zeit, liegt wahrscheinlich eine Wiedergabedrift oder Bildratenumwandlung vor, die sich nicht durch konstantes Verschieben beheben lässt. Übermitteln Sie den vollständigen SRT-Text und die vorzeichenbehaftete Ganzzahl. Das Ergebnis behält Nummerierung und Textzeilen bei und ersetzt alle gültigen Zeitbereiche. Speichern Sie es als neue `.srt`-Datei und vergleichen Sie es mit dem Original, bevor Sie Produktionsmaterial ersetzen.
Beachten Sie Prüfung und Nullbegrenzung
Jeder SRT-Block benötigt einen numerischen Index, eine Zeitzeile und mindestens eine Untertitelzeile. Zeitangaben verwenden das Standardformat `Stunden:Minuten:Sekunden,Millisekunden`: mindestens zwei Ziffern für Stunden, jeweils zwei für Minuten und Sekunden sowie genau drei für Millisekunden. Minuten und Sekunden müssen zwischen null und neunundfünfzig liegen. Das Werkzeug weist einen Block zurück, wenn seine Zeitzeile dieser Struktur nicht entspricht, einer der Zeitstempel fehlerhaft ist oder das ursprüngliche Ende vor dem Anfang liegt. Diese strenge Prüfung verhindert Teilergebnisse, die erfolgreich wirken, aber defekte Blöcke enthalten. Ein negativer Versatz wird getrennt auf beide Grenzen angewendet. Fällt ein Ergebnis unter null, wird es exakt zu `00:00:00,000`. Ein Block, der vollständig vor dem Betrag eines großen negativen Versatzes liegt, kann dadurch am Anfang auf eine Dauer von null schrumpfen. Das ist die vorgesehene Begrenzung und kein Rechenfehler. Kontrollieren Sie nach einer starken Vorverlegung besonders die ersten Blöcke.
Setzen Sie die verschobene Datei sicher im Arbeitsablauf ein
Bewahren Sie die ursprüngliche Datei auf und speichern Sie das Ergebnis unter einem neuen Namen, bis Sie es mit dem richtigen Video geprüft haben. Kontrollieren Sie Dialoge, Musik und Szenenwechsel an mehreren Stellen, statt sich nur auf einen frühen Untertitel zu verlassen. Der Vorgang ändert ausschließlich Zeitstempel: Er übersetzt keinen Text, nummeriert Blöcke nicht neu, korrigiert keine Rechtschreibung, ergänzt keine fehlenden Untertitel und gleicht keine Drift aus. Zeilenumbrüche innerhalb des Textes bleiben erhalten, sodass mehrzeilige Untertitel ihre Gestaltung behalten. Das Ergebnis vereinheitlicht Zeilenenden und Blockabstände in einer Form, die übliche SRT-Programme akzeptieren. Da der Algorithmus deterministisch arbeitet und weder Netzwerk noch Zufall oder Modelle verwendet, liefern dieselbe Eingabe und derselbe Versatz stets dasselbe Ergebnis. Sie können ihn im Browser ausführen oder für $0.002 pro Anfrage über die API automatisieren. Dokumentieren Sie bei Stapelverarbeitung den Versatz zusammen mit der Videofassung, weil eine für einen Schnitt ermittelte Korrektur nach einem zusätzlich eingefügten Vorspann oder Werbeblock nicht mehr passen kann.
Anwendungsfälle
Konstanten Tonversatz korrigieren
Verschieben Sie alle Untertitel nach hinten, wenn eine Muxing- oder Wiedergabeeinstellung sie vor der gesprochenen Sprache zeigt.
Entfernten Vorspann ausgleichen
Verlegen Sie alle Blöcke vor, nachdem ein Vorspann, Countdown oder eine Titelsequenz fester Länge entfernt wurde.
Lieferdatei vereinheitlichen
Wenden Sie einen gemessenen redaktionellen Versatz an und erhalten Sie einheitliche SRT-Zeiten für die Veröffentlichung.
Häufige Fragen
Soll ich einen positiven oder negativen Versatz verwenden?
Mit einem positiven Wert erscheinen Untertitel später, mit einem negativen Wert früher.
Was geschieht, wenn ein Zeitstempel unter null fällt?
Die betreffende Start- oder Endzeit wird auf `00:00:00,000` begrenzt; eine negative Zeit entsteht nie.
Behebt dies eine Untertiteldrift?
Nein. Ein konstanter Versatz behebt eine konstante Differenz. Eine wachsende Abweichung erfordert eine Geschwindigkeits- oder Bildratenkorrektur.
Ändern sich Text oder Nummerierung?
Nein. Nummern und Textzeilen bleiben bestehen; nur die Zeiten werden ersetzt sowie Zeilenenden und Blockabstände vereinheitlicht.
Was passiert bei einer ungültigen Zeitangabe?
Die gesamte Anfrage schlägt mit einem Eingabefehler fehl, der den betroffenen Block nennt; eine Teildatei wird nicht ausgegeben.
Was kostet eine API-Anfrage?
Der API-Preis beträgt $0.002 pro Anfrage. Derselbe deterministische Vorgang ist auch im Browser verfügbar.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem 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)Beispiel-Anfrage
{
"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
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "video.subtitle_srt_shift",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_mb | 500 |
max_minutes | 60 |
max_megapixels | 3.9 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |