2026 SRT vs WebVTT Subtitle Timestamp Sync & Framerate Drift Table
2026 Verified ReferenceUse a constant millisecond offset (`+ms` or `-ms`) when subtitles are uniformly early or late throughout a video, and apply a framerate ratio multiplier (`23.976 / 25 = 0.95904`) when subtitle desynchronization grows progressively worse from the beginning to the end of the film.
Linear Drift Fix: New_Time = (Old_Time - Anchor_Time) × (Source_FPS / Target_FPS) + Offset_ms| Subtitle Desync / Conversion | Symptom or Format Difference | Correction Formula / Rule | FFmpeg / CLI One-Liner |
|---|---|---|---|
| Subtitles Appear 2.5s Too Early | Text shows before actor speaks (constant gap) | Add +2500 ms (+00:00:02,500) to all cues | ffmpeg -itsoffset 2.5 -i subs.srt -c copy synced.srt |
| Subtitles Appear 1.8s Too Late | Actor speaks before text appears (constant gap) | Subtract -1800 ms (-00:00:01,800) from all cues | ffmpeg -itsoffset -1.8 -i subs.srt -c copy synced.srt |
| SRT (.srt) to WebVTT (.vtt) | HTML5 <track> requires WEBVTT header & dot ms | Prepend WEBVTT + replace ,mmm with .mmm | ffmpeg -i input.srt output.vtt |
| 25 fps (PAL) to 23.976 fps (Blu-ray) | Subs drift ~2.5s out of sync every 60 minutes | Multiply timestamps by 1.042709 (25 / 23.976) | Scale Cue_ms × 1.042709376 |
| 23.976 fps to 25 fps (PAL Speedup) | Subs fall progressively behind video dialogue | Multiply timestamps by 0.959040 (23.976 / 25) | Scale Cue_ms × 0.959040000 |
| Mojibake / Garbled Accents Fix | Latin-1 (ISO-8859-1 / CP1252) opened as UTF-8 | Transcode byte stream to UTF-8 without BOM | iconv -f WINDOWS-1252 -t UTF-8 subs.srt > utf8.srt |
