Skip to content
AZ Tools

SRT ↔ VTT Subtitle Converter

Convert subtitle files between SRT (SubRip) and WebVTT — auto-detects the input format, fixes timestamp punctuation, optionally strips VTT styling tags.

How to use

  1. Paste subtitle text or drop a .srt / .vtt file. Format is auto-detected.
  2. Pick the conversion direction. When SRT → VTT, the header and .-separated milliseconds are added; when VTT → SRT, the header is dropped and milliseconds use a comma.
  3. Copy the converted text or download it as a file.

About this tool

Show

SRT and WebVTT describe the same thing — a list of cues, each with a start time, an end time and some text — and differ in details that are easy to get wrong by hand. SRT separates milliseconds with a comma and numbers every cue; VTT uses a full stop, opens with a WEBVTT line, makes the hour field optional and allows a named identifier before the timestamp. This converter auto-detects which one you pasted and writes the other, always emitting a full HH:MM:SS timestamp so the output is accepted by the strictest parsers.

Fractional seconds are normalised on the way in: a timestamp written 00:01:02.5 is read as 500 milliseconds, not 5, because the fraction is padded to three digits rather than parsed as an integer. Getting that backwards silently shifts every cue in a file by up to a second, which is the sort of error you only notice when the dialogue lands on the wrong shot.

What does not survive is everything VTT has that SRT has no place for. STYLE, NOTE and REGION blocks are skipped rather than carried across. Cue settings that follow the end timestamp — line:, align:, position: — are dropped, so a caption deliberately placed at the top of the frame to avoid burned-in text comes back centred at the bottom. Cue identifiers are read and not written out. Inline VTT markup can be kept or stripped with the toggle, which matters because <c.classname> and <v Speaker> mean nothing to most SRT players and will show up as literal angle brackets on screen if you leave them in.

One thing to check outside this tool: the file's encoding. WebVTT must be UTF-8, while SRT files in circulation are frequently Windows-1252, Shift-JIS or Big5 — a decades-old convention that no header records. If accented or non-Latin characters arrive as mojibake, the damage happened when the file was decoded, before any conversion, and re-saving as VTT will faithfully preserve the wrong characters. Everything here runs in the browser, and the result downloads as a .srt or .vtt file.

Frequently asked questions

Will VTT styling survive a round-trip to SRT?

SRT has no formal styling spec, so inline <c.…> tags get stripped if you toggle that off. Some players read <i> / <b> tags in SRT, which both formats share, so leaving 'preserve styling' on keeps those.

Why does my VTT have . and my SRT has , between seconds and milliseconds?

It's the only meaningful difference in timestamp format — 00:00:01.000 is VTT, 00:00:01,000 is SRT. This tool flips the separator automatically.

The subtitles drift further out of sync as the video plays. Can conversion fix that?

No — a growing offset is a frame-rate mismatch, not a formatting problem. Subtitles authored against a 25 fps master and played over a 23.976 fps transfer drift by about four per cent, which is a second every twenty-five seconds. That needs a time stretch, not a rewrite of the timestamps' punctuation. A constant offset, by contrast, is just a shift and can be corrected by adding the same amount to every cue.

Why does my player show no subtitles at all after converting?

Check the two things a WebVTT file needs that an SRT file does not: the literal WEBVTT header on the first line, and being served as text/vtt. A file that is otherwise perfect fails silently without either. Browsers also require the track to be same-origin or CORS-enabled, which is a common surprise when the video and the subtitles come from different hosts.

Related tools