Guide · ~8 min read
SRT offset in milliseconds: fix lip sync without re-timing every cue
When dialogue and subtitles disagree by the same gap on every line, you do not need to drag hundreds of cues. A global millisecond offset on the SubRip file fixes lip sync in one pass. This guide covers measurement, sign (+/−), frame-to-ms math, and when to stop tweaking.
Lip sync vs drift (decide first)
Good candidate for ms offset: the actor’s mouth and the subtitle line are consistently off by ~300 ms from the cold open through the end card.
Bad candidate: sync is acceptable at 00:02:00 but wrong by 1.5 s at 00:45:00. That is drift—often FPS, dropped frames, or wrong source duration. Fix the timeline or re-export captions; a single offset will not save the whole file.
See fix constant subtitle delay for the three-spot test before you commit to a number.
Measure in milliseconds
- Pick a sharp consonant ( “t”, “k”, “p” )—easier to see than vowels.
- Note the time speech starts (player or NLE timecode).
- Note when the subtitle appears.
- Difference = how late or early the text is.
Example: speech at 01:02,400 and subtitle at 01:02,850 → text is 450 ms late → apply +450 ms to all cues.
Repeat on two other scenes. If all three agree within ~50 ms, one global shift is enough.
Sign convention (+ / −)
| What you see | Meaning | Offset |
|---|---|---|
| Text after speech | Subs late | + ms |
| Text before speech | Subs early | − ms |
Dubbing workflows often need +300 ms to +800 ms because replaced audio starts slightly later than the original guide track. Short-form cuts sometimes need less.
Frames to milliseconds
Editors often nudge “two frames.” SubRip tools want milliseconds. Approximate:
- 24 fps: 1 frame ≈ 41.67 ms
- 25 fps: 1 frame = 40 ms
- 30 fps: 1 frame ≈ 33.33 ms
- 23.976 fps: 1 frame ≈ 41.71 ms
Use the FPS ↔ ms offset calculator when your notes are in frames but your export is SRT. Then apply the result in SRT time shift.
Apply the shift
Open the .srt in a browser tool, enter offset in ms (or seconds if the UI allows), preview
the first and last cue times, download shifted.srt, and re-link in Premiere,
DaVinci, VLC, or your delivery pipeline.
For WebVTT sidecars on HTML5 or vertical exports, use VTT time shift so dot-milliseconds stay valid.
Fine-tuning loop
- Apply your best estimate (+500 ms, for example).
- Check hook, mid-scene dialogue, and end.
- If still slightly late, add +50 ms to +100 ms—not another full guess.
- Stop when two reviewers agree; perfection past ±50 ms rarely matters on social video.
Related workflows
Delay subtitles 500 ms for dubbing — common starting point. Shift SRT online — privacy-first steps. After sync, run line length before burning captions on 9:16.
Shift SRT by milliseconds (free)
How to use
- Confirm constant delay on three cues (start, middle, end).
- Estimate offset in ms (positive if subs are late vs speech).
- Apply global shift in the SRT tool; download and spot-check lip sync.
- Fine-tune in 50–100 ms steps if needed.
Frequently asked questions
- Should I fix lip sync in milliseconds or seconds?
- Use milliseconds for fine tuning after dubbing—100 ms steps are easy to hear. Seconds fields are fine for rough +1 s errors. Most constant-delay fixes land between 200 ms and 800 ms.
- Positive or negative SRT offset for late subtitles?
- If text appears after the speaker, subtitles are late—apply a positive offset (move cues later). If text flashes before speech, use a negative offset.
- How do frames relate to milliseconds?
- At 24 fps one frame ≈ 41.67 ms; at 30 fps ≈ 33.33 ms; at 25 fps 40 ms. Use an FPS-to-ms calculator when your editor thinks in frames but your SRT tool wants ms.
- Will shifting break the first subtitle at 00:00:00?
- Good shifters clamp at zero so negative offsets do not create invalid negative timecodes. Preview the opening hook after any large negative shift.
- Is lip sync the same as constant delay?
- Constant delay looks like bad lip sync on every line. If sync drifts over the runtime, you need regeneration or FPS fixes—not a single ms offset.
- Can I combine ms shift with frame-based edits?
- Yes. Measure in frames in the NLE, convert to ms, apply globally in SRT, re-import. Avoid mixing per-cue manual edits with a global shift unless you know the order of operations.