Uttir
By Uttir 7 min read

How to Convert SRT to VTT or SUB (and Why You Might Need To)

A practical guide to subtitle formats: the differences between SRT, WebVTT, and MicroDVD SUB, the format compatibility matrix for common players, the timing-shift and FPS-scaling cases that come up when subtitles drift, and how to convert everything in your browser without uploading your file anywhere.

SRT is the most common subtitle format. WebVTT is the modern web standard, used by HTML5 video and most streaming platforms. MicroDVD SUB is a legacy format that stores timing as frame numbers, used by some older players. The conversion is mostly mechanical: SRT uses commas for the decimal separator and a different header; VTT uses dots and adds a "WEBVTT" header. For most cases, the only real difference is the timing. A browser-based converter handles all three formats, plus timing shifts (for sync fixes) and FPS scaling (for frame-rate conversions), without uploading the file anywhere.

Subtitle formats are one of those things that look interchangeable until you try to load a file in a player that does not support it. SRT, WebVTT, and MicroDVD SUB are the three formats that cover 95% of real-world use. This post covers the differences, the format compatibility matrix for common players, the timing-shift and FPS-scaling cases that come up when subtitles drift, and how to convert everything in your browser without uploading your file anywhere.

The three subtitle formats you will actually meet

There are dozens of subtitle formats, but for almost every use case, you only need to know three.

SRT (SubRip)

The most common subtitle format. A plain text file with one cue per block:

1
00:00:01,000 --> 00:00:04,000
Welcome to the show.

2
00:00:05,000 --> 00:00:08,000
Today we are talking about subtitles.

Key details: timestamps use a comma for the decimal separator (00:00:01,000), the arrow is --> with spaces around it, the cue number is the line number (often optional but commonly included), and the file has no header. SRT is supported by virtually every video player, including VLC, mpv, HandBrake, Adobe Premiere, Final Cut Pro, and YouTube (when uploading an SRT for captioning).

WebVTT (.vtt)

The modern web standard for subtitles, defined in the W3C specification. Used by HTML5 video, most streaming platforms, and most modern players. Same structure as SRT, with two key differences:

WEBVTT

1
00:00:01.000 --> 00:00:04.000
Welcome to the show.

2
00:00:05.000 --> 00:00:08.000
Today we are talking about subtitles.

Key details: the file starts with WEBVTT on the first line, timestamps use a dot for the decimal separator (00:00:01.000), and the arrow is the same. WebVTT supports a few extras SRT does not: positioning (where on screen the cue appears), styling, and voice tags for accessibility. For most uses, SRT and WebVTT are interchangeable except for the file header and the decimal separator.

MicroDVD SUB (.sub)

A legacy format that stores timing as frame numbers instead of timestamps. Used by some older DVD players and a few video editors. The file looks like:

{1}{120}Welcome to the show.
{121}{360}Today we are talking about subtitles.

The numbers are frame numbers, not timestamps. To convert to or from SUB, you need to know the FPS of the video. A 25 FPS video with the same content as the example above would have the same frame numbers; a 30 FPS video would have different numbers (frames are 33.3ms instead of 40ms). This is the only common format where conversion requires knowing the FPS, which is the source of most SUB-related bugs.

Format compatibility for common players

The compatibility matrix for the formats you will actually use:

  • VLC. All three (SRT, VTT, SUB). Auto-detects from extension.
  • mpv. All three. SRT and SUB are the most common; VTT works for HTML5 video sources.
  • HandBrake (encoder). SRT input. Outputs SRT for soft subs or burns them in.
  • Adobe Premiere Pro. SRT input (Premiere 2020+).
  • Final Cut Pro. SRT input (with conversion to FCPXML for the timeline).
  • YouTube caption upload. SRT, VTT, and SBV. SRT is the most common.
  • Vimeo caption upload. SRT and WebVTT.
  • HTML5 video tag. WebVTT only. This is the biggest reason to convert SRT to VTT for a website.
  • FFmpeg (encoding). All three as input. SRT is the most common output for soft subs.

The rule of thumb: SRT is the universal interchange format. VTT is required for HTML5 video. SUB is legacy and rarely needed today. If you only support one format, support SRT; if you support two, add VTT.

Why subtitles drift (and the two common fixes)

Subtitles drift when the timestamps do not match the video's actual timing. The two most common causes:

1. The subtitle was authored for a different cut of the video

You downloaded a subtitle for "Movie.mkv" but your file is "Movie-directors-cut.mkv" with different scene timings. The fix is a uniform time shift: every cue moves by the same amount (say, +2 seconds, or -500ms). The Subtitle Converter handles this directly with a "shift by ms" input.

2. The video was re-encoded at a different frame rate

The subtitle was authored for a 23.976 FPS video; your video is 25 FPS. The same content takes 4% longer in the 25 FPS version, so every cue needs to be stretched by 4%. The fix is an FPS scale: a factor of 25/23.976 ≈ 1.0427. The Subtitle Converter handles this directly with a "scale by factor" input.

The two are different operations. A time shift moves every cue by the same amount (in milliseconds). An FPS scale multiplies every timestamp by a factor. The right one depends on the cause of the drift. The "this cut of the movie is 2 seconds longer" case is a time shift. The "video was re-encoded at a different frame rate" case is an FPS scale.

How the format conversion works

The SRT-to-VTT conversion is mechanical:

  1. Add the WEBVTT header as the first line.
  2. Replace every comma in timestamps with a dot.

That is the entire conversion. The reverse (VTT to SRT) is the same in reverse: strip the header, replace dots with commas. Both are lossless and reversible.

The SRT-to-SUB conversion is the same plus a frame-number conversion. If the video is 25 FPS:

  1. Add the WEBVTT header (or skip if converting to SRT).
  2. For each timestamp, convert to a frame number: floor(timestamp_in_ms / 1000 * FPS).
  3. Format as {start_frame}{end_frame}text per line.

The reverse (SUB to SRT) is the same in reverse: parse the frame numbers, convert to timestamps using the FPS. The conversion is lossy in the same way that "1.5 seconds" is lossy in float — frame numbers are exact at the frame level, but the timestamp reconstructed from a frame number is approximate at the millisecond level. For most uses, this is fine; for frame-accurate editing, work with the original format.

How to use the Subtitle Converter

  1. Open the Subtitle Converter.
  2. Paste your subtitle text or drop a .srt / .vtt / .sub file.
  3. Choose the source format (auto-detected from the file if you used a file).
  4. Choose the target format.
  5. Optionally, set a time shift (in milliseconds) and an FPS scale factor (e.g. 1.0427 for 23.976 → 25 FPS).
  6. Click convert. The result appears in the output box, ready to copy or download as a file.

The conversion runs in the browser. The file is in your input field, the conversion happens in JavaScript, and the result is rendered locally. Nothing is sent to a remote service, nothing is logged, and the file does not need to leave your device.

Common cases the converter handles

Convert SRT to VTT for HTML5 video

The HTML5 <video> tag requires WebVTT for <track> elements. If you have an SRT file, convert it to VTT before referencing it. The conversion is two changes (header and decimal separator), and the result is the same content with a different file extension.

Shift subtitles by a fixed amount

You downloaded a subtitle, but the timing is off by 2 seconds. Open the converter, set the shift to 2000 (or -2000), and download the result. The shifted subtitle has the same content with every timestamp adjusted.

Scale subtitles to a different frame rate

You have a 23.976 FPS subtitle and a 25 FPS video. Set the scale to 25/23.976 = 1.0427 (the converter will accept this as a decimal or as a ratio). The result is a 25 FPS subtitle that matches the video timing.

Convert SRT to SUB for a legacy player

Some older DVD players and editing software only support SUB. Set the source to SRT, the target to SUB, the FPS to match the video. The conversion is the same as above with the additional frame-number step.

How to check the conversion was correct

The fastest way to verify a subtitle conversion is to load both the original and the converted file in a player (VLC works for all three) and step through the timeline. The text should appear at the same moments. If it does not, the source format detection may have been wrong (try explicitly setting the source format) or the time shift may need to be adjusted.

For a quick text check, the Text Diff tool can show the differences between the original and the converted file, ignoring the timing lines. The text content should be identical; only the timing should differ.

The privacy case for browser-based conversion

Subtitle files are usually safe to upload to a conversion service — they do not contain personal information. But some subtitle files are for personal projects (recorded lectures, family videos, private captions), and the privacy of doing the conversion in the browser is the same as for any other tool: the file does not leave your device, the result is yours to keep, and there is no third-party log of what you converted.

For professional use (translating subtitles for clients, batch-converting a library), a dedicated CLI tool like FFmpeg is faster and more flexible. For one-off conversions, the browser tool is faster to set up and does not require installing anything.

A short pre-conversion checklist

  1. Identify the source format (open the file in a text editor; SRT and VTT are human-readable, SUB has the {frame} format).
  2. Identify the target format (what the destination player supports).
  3. If the subtitles are drifting, identify whether it is a time shift (consistent offset) or an FPS scale (proportional offset). The first is fixed with ms; the second is fixed with a factor.
  4. Open the converter, paste the file, set the options, and convert.
  5. Verify the result in the same player that will play the final video.

The whole conversion is under a minute. The math is mechanical, the result is exact (modulo float rounding for FPS scales), and the file stays on your device the whole time.

#subtitle#srt#vtt#sub#video#conversion#caption

New tools and guides, once a week

One short email when something new ships. No tracking, no images, unsubscribe with one click.