Nothing ruins a film or lecture faster than captions that appear three seconds before the actor speaks - or worse, subtitles that start out synced in the opening scene and drift further behind every ten minutes. Use this subtitle time shifter to fix constant millisecond offsets, cure progressive PAL-to-NTSC framerate drift (such as 25 FPS to 23.976 FPS), calibrate any file using two known spoken lines, and convert cleanly between .srt and .vtt in your browser.
Constant delay vs. progressive framerate drift: why simple shifters fail
Out-of-sync subtitle files always suffer from one of two mathematical problems, and applying the wrong fix makes the second half of the video unwatchable.
- Constant Offset (Fixed Delay): The subtitles are consistently early or late by the exact same amount (for example, +2.5 seconds) from the opening credits all the way to the end credits. This happens when your video file has a 2.5-second studio logo at the start that was missing from the video the subtitle author used. Adding or subtracting
2500 msacross every cue fixes the entire file in one click. - Progressive Framerate Drift (Tempo Mismatch): You sync the first line of dialogue at minute 02:00, but by minute 45:00 the subtitles are 2 minutes early! This happens when the subtitles were timed for a 25.000 FPS European PAL broadcast, while your video plays at 23.976 FPS cinema rate ($25 / 23.976 = 1.042709$). Every second, the subtitles run 4.27% faster than the movie. Fixing progressive drift requires multiplying every timestamp by a scaling ratio - or using 2-Point Anchor Calibration where you simply enter the true video time of the first spoken line and the last spoken line.
How to resync subtitles step by step (3 synchronization methods)
Start by dropping your .srt or .vtt file into the upload zone (or pressing Ctrl + V to paste raw subtitle text). You can also load your local video file into the built-in preview player to test your timing live. Then choose the synchronization method that matches your symptom:
Method 1: Fix a Constant Delay (Subtitles Uniformly Early or Late)
- Check the delay direction: Note whether captions appear before the actor speaks (too early → need a positive
+shift) or after the actor speaks (too late → need a negative-shift). - Apply a millisecond offset: Click the quick-offset buttons (
-5s,-1s,-500ms,+500ms,+1s,+5s) or type an exact millisecond value (such as+1850or-2400) and apply it. - Optional — Shift only a specific scene range: If captions only fall out of sync after a commercial break at minute 22:00, select only the rows from minute 22:00 onward in the cue table before applying the offset.
- Export your synced captions: Click Download .SRT or Download .VTT.
Method 2: Fix Progressive Framerate Drift (25 FPS ↔ 23.976 FPS Presets)
- Identify tempo drift: Use this mode when the opening scene is in sync, but subtitles drift progressively further ahead or behind every ten minutes.
- Select a Framerate Ratio Preset: Choose a standard broadcast-to-cinema conversion ratio (such as 25 FPS → 23.976 FPS, 23.976 FPS → 25 FPS, 24 FPS → 23.976 FPS, or 30 FPS → 29.97 FPS) or enter custom source and target frame rates.
- Apply ratio scaling and verify: Every timestamp is multiplied by the exact tempo ratio ($t' = t \times \text{ratio}$); spot-check a line near the end of the film in the cue table and download your
.srtor.vttfile.
Method 3: Two-Point Anchor Calibration (When You Don't Know the Framerate)
- Pick Anchor 1 (an early spoken line): Select a clear dialogue cue near the beginning of the video (e.g., Cue #12) and type the exact
HH:MM:SS,mmmtimestamp where you hear that line spoken in your video player. - Pick Anchor 2 (a late spoken line): Select a second dialogue cue near the end of the video (e.g., Cue #1380) and type the exact timestamp where you hear that final line spoken.
- Click Apply Anchor Calibration: The linear regression solver computes both the starting offset ($b$) and the exact stretch factor ($a$) simultaneously so every cue from start to finish locks onto the audio track.
Two-point linear regression, live video preview, and SRT/VTT conversion
This workspace is built for serious caption editing rather than just adding a number to a timestamp.
- 2-Point Anchor Linear Calibration ($t' = a \cdot t + b$): Pick Cue #A near the start of the video and Cue #B near the end, type the real timestamps where you hear those two lines spoken, and click Apply Anchor Calibration. The engine solves the exact linear equation for both the framerate stretch factor ($a$) and the starting offset ($b$) simultaneously.
- Framerate Drift Ratio calculator: Includes one-click cinema and broadcast ratios (25 → 23.976 FPS, 23.976 → 25 FPS, 24 → 23.976 FPS, 30 → 29.97 FPS) plus custom source/target FPS inputs.
- Selective cue shifting: Need to shift only cues after a commercial break at minute 22:00 while leaving the first 22 minutes untouched? Select a subset of rows in the interactive cue table and apply the time shift only to the selected cues.
- Built-in HTML5 Video Sync Test Player: Load your local MP4/WebM/MKV video into the side-by-side preview player to watch your shifted captions render over the video in real time before downloading.
- Bidirectional SRT ↔ WebVTT converter: Automatically converts comma millisecond separators (
00:01:24,500) for SubRip (.srt) and dot separators withWEBVTTheaders (00:01:24.500) for HTML5 WebVTT (.vtt).
Worked example: curing a drifting 2-hour movie subtitle file
Suppose you have a 1,420-cue subtitle file (Movie-Captions.srt) where:
- Cue #12 ("Good morning, Commander") is listed in the SRT at
00:01:40,000(100.0 seconds), but in your video player you hear the actor say it at00:01:42,500(102.5 seconds). - Cue #1380 ("See you on the other side") is listed in the SRT at
01:36:00,000(5,760.0 seconds), but in your video player you hear it at01:40:06,600(6,006.6 seconds).
If you only shifted the file by +2.5 seconds based on the first line, the final line would still be 4 minutes and 4 seconds out of sync!
Instead, you open 2-Point Anchor Calibration:
- Set Anchor 1 to Cue #12 with Target Time
00:01:42,500. - Set Anchor 2 to Cue #1380 with Target Time
01:40:06,600. - Click Apply Anchor Calibration. The solver computes the exact scale factor: $a = \frac{6006.6 - 102.5}{5760.0 - 100.0} = \frac{5904.1}{5660.0} = 1.043127$ and base offset $b = -1.813\text{ seconds}$, updating all 1,420 cues in 0.05 seconds so every single line from minute 1 to minute 100 hits on the exact syllable.
Handling negative timestamps and formatting edge cases
What happens if Cue #1 in your file starts at 00:00:02,000 and you apply a -5.000s shift? Media players crash or reject subtitle files that contain negative timestamps like -00:00:03,000. Our timestamp engine automatically clamps any sub-zero timestamp to 00:00:00,000 while preserving the cue's minimum readable duration so the output file remains 100% compliant with VLC, Plex, Jellyfin, and YouTube Studio.
Also note that when converting from .vtt to .srt, WebVTT-specific CSS positioning tags (like line:85% align:start) are stripped cleanly from the timestamp header line because strict hardware .srt players only accept HH:MM:SS,mmm --> HH:MM:SS,mmm.
Local browser processing
Both your subtitle files (.srt, .vtt) and any local video file you load into the sync preview player stay 100% inside your browser's local memory. Zero data is uploaded to any server.
Related video and text utilities
Need to convert your video container to MP4 or WebM so it plays in the browser preview player? Use the Video Converter or shrink it in the Video Compressor & Trimmer. To compare two different subtitle translations side by side, open the Code & Text Diff Checker, or read our full guide on how to fix subtitle delay and resync SRT & VTT files.