SRT vs VTT: the two subtitle formats, and how to fix timing

Subtitles travel as small text files, and two formats cover almost everything: SRT, from a DVD-ripping tool in the 1990s, and WebVTT, the web standard built on it. They differ by a header and a punctuation mark, which is exactly enough to make a player reject one of them. This guide shows the structure, where each works, and the two fixes people actually need โ€” conversion and timing shifts โ€” both of which the subtitle converter does in the browser.

SRT: the 1990s format that won

1
00:00:01,000 --> 00:00:04,000
Hello, and welcome.

2
00:00:04,500 --> 00:00:07,250
Let's begin.

SubRip Text: a running number, a time range with a comma before the milliseconds, one or more lines of text, a blank line. That's all. It carries no styling beyond a few HTML-ish tags (<i>, <b>) that some players honour, no positioning, and no metadata. Its simplicity is why every player, editor, TV and subtitle site accepts it, and why it is the format subtitles are downloaded and shared in.

WebVTT: the web's version

WEBVTT

00:00:01.000 --> 00:00:04.000
Hello, and welcome.

00:00:04.500 --> 00:00:07.250 line:90%
Let's begin.

WebVTT (a W3C standard since the 2010s) starts with a WEBVTT header, drops the cue numbers (optional identifiers are allowed), and uses a dot before the milliseconds. It adds what the web needed: positioning and alignment settings after the timestamp, a STYLE block with CSS, voice tags for speakers, and chapters and descriptions. It is what the HTML5 <track> element requires, what YouTube and most video platforms prefer, and what accessibility tooling targets.

Where each is used

  • SRT: VLC and desktop players, Plex and media servers, subtitle download sites, most editing software, Netflix and broadcaster deliveries (alongside professional formats).
  • VTT: web video (the <track> tag), YouTube, Vimeo, LinkedIn and most course platforms, JW Player and Video.js.

Conversion is mostly punctuation and the header, which is why hand-editing goes wrong on cue 300. Positioning settings in a VTT have no SRT equivalent and are dropped honestly rather than mangled; styling tags pass through as text.

Fixing subtitles that are out of sync

The commonest subtitle problem: they run two seconds early throughout, because the file was timed against a cut with a different intro. If the offset is constant, shift every timestamp by the same amount and the whole file snaps into place โ€” the converter's shift field does it, with times clamped so nothing goes negative. If the drift grows over the film, the frame rate differs (23.976 versus 25 fps is the classic) and the times need scaling by the ratio, not shifting; that needs an editor like Subtitle Edit or Aegisub. Player-side nudging (VLC's G and H keys) is fine for watching once; fixing the file is right for anything you'll share.

Making subtitles in the first place

Transcribe, then time. Extract the sound with video to audio, slow it with the audio speed tool to type along, and write cues with sensible lengths: about 35โ€“42 characters per line, two lines maximum, on screen for at least a second and rarely more than seven. Auto-captioning services get the words mostly right and the timing well; the editing is in fixing names, punctuation and line breaks. Then save as SRT for distribution and VTT for the web โ€” one source file, two exports.

Sources and further reading

The claims in this guide rest on these references, which were checked when the guide was last updated. Spotted an error? The contact page says how to report it.

  1. WebVTT: The Web Video Text Tracks Format โ€” W3C
  2. SubRip โ€” Wikipedia
  3. WebVTT โ€” Wikipedia

Try the tool

Frequently asked questions

What's the difference between SRT and VTT?

VTT adds a WEBVTT header, uses a dot instead of a comma in timestamps, drops cue numbers and supports positioning and styling. Otherwise the structure is the same.

Which format does YouTube want?

It accepts both, but VTT (or its own SBV) is preferred; HTML5 video and most web players require VTT.

My subtitles are a few seconds early โ€” how do I fix them?

If the offset is constant, shift every timestamp by that amount (the converter does it). If they drift over time, the frame rate differs and the times need scaling in a subtitle editor.

Do styles survive conversion?

Basic italic and bold tags pass through. VTT positioning and CSS have no SRT equivalent and are dropped.