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

  1. Pick a sharp consonant ( “t”, “k”, “p” )—easier to see than vowels.
  2. Note the time speech starts (player or NLE timecode).
  3. Note when the subtitle appears.
  4. 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 seeMeaningOffset
Text after speechSubs late+ ms
Text before speechSubs 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:

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

  1. Apply your best estimate (+500 ms, for example).
  2. Check hook, mid-scene dialogue, and end.
  3. If still slightly late, add +50 ms to +100 ms—not another full guess.
  4. 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

  1. Confirm constant delay on three cues (start, middle, end).
  2. Estimate offset in ms (positive if subs are late vs speech).
  3. Apply global shift in the SRT tool; download and spot-check lip sync.
  4. 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.