← Home
FREE TOOL

Published · Updated

SRT to VTT Converter

Convert SubRip (.srt) subtitles to WebVTT (.vtt) and WebVTT back to SubRip. Paste the text or drop the file; the direction is detected for you. Everything runs in your browser — the file is never uploaded.

The conversion is mostly about two characters and one line: SubRip writes 00:00:01,500 and WebVTT writes 00:00:01.500, and a WebVTT file must open with the word WEBVTT. The rest of this page is the part that actually catches people out — what each format is for, what WebVTT can say that SubRip cannot, and why a .vtt file that looks correct sometimes refuses to appear in a browser.

Convert subtitles

RUNS IN YOUR BROWSER · NOTHING IS UPLOADED

Drop a .srt or .vtt file here, or paste the text below.

What SRT Is, and Where It Is Used

SubRip Text — .srt — came out of SubRip, a Windows program first released in 2000 that extracted subtitles from DVDs, later reading them with OCR. The format is whatever that program happened to write: a numbered list of cues, each one an index, a timing line, and one or more lines of text, separated by blank lines. There is no standards body behind it and no formal specification. What SRT "is" is defined by what players accept.

That accident of history is also its strength. Twenty-five years of players were written against it, so SRT is the format that works everywhere: VLC, mpv, Plex, every smart TV, Premiere Pro, DaVinci Resolve, Final Cut, YouTube, Vimeo, Facebook, LinkedIn and essentially every "upload your subtitles" box on the internet. If you have one subtitle file and you do not know where it is going, SRT is the safer thing to have.

Styling in SRT is entirely a convention. <i>, <b>, <u> and <font color="#ffcc00"> are widely honoured because the players that grew up alongside the format already understood HTML fragments — not because anything says they should. Positioning is not part of the format at all. An SRT cue appears wherever the player puts cues.

What WebVTT Is, and Where It Is Used

WebVTT — Web Video Text Tracks, .vtt — is a W3C specification written for the web. It is what the HTML5 <track> element parses, and it is the only thing that element parses. Browsers do not read SRT. That single fact is why most people arrive at a converter like this one.

Because it was designed rather than inherited, WebVTT has room for things SubRip never needed. A file opens with the signature line WEBVTT, optionally followed by header metadata. Cue identifiers are optional and can be any text. The hours field is optional, so 00:01.500 is a legal timestamp. After the end time you can put cue settings — line, position, align, size, vertical, region — that place the cue on screen. NOTE blocks are comments. STYLE blocks carry real CSS applied through the ::cue pseudo-element. REGION blocks define scroll-up areas for live captioning. Inside a cue you can mark the speaker with <v Alex>, tag spans with <c.loud> for CSS to target, and time individual words with tags like <00:00:02.500> for karaoke highlighting.

Outside the browser, WebVTT is also the subtitle format of HLS streaming, and the format most JavaScript player libraries expect — hls.js, video.js, Shaka Player, Plyr. If your video is playing inside a web page, the subtitle file is almost certainly WebVTT.

The Exact Differences

SRT (SubRip)WebVTT
First line(none)Must be WEBVTT
Decimal separatorComma — 00:00:01,500Period — 00:00:01.500
Hours fieldAlways writtenOptional — 00:01.500 is valid
Cue identifierSequential number, expectedOptional, any text without an arrow
Cue settingsNonealign, line, position, size, vertical, region
CommentsNoneNOTE blocks
Style blocksNoneSTYLE with ::cue CSS
Regions (roll-up)NoneREGION blocks
Inline tags<i> <b> <u> <font>, by conventionThose, plus <v> <c> <lang> <ruby>
Per-word timingNone<00:00:02.500> inside a cue
Text encodingAnything — often Windows-1252UTF-8 only
MIME typeapplication/x-subrip (de facto)text/vtt (registered)
Works in HTML5 <track>
Desktop players and NLEsUniversalCommon, not universal

Read that table one way and WebVTT is a superset of SubRip. That is the practical rule to remember, and it is what makes the two directions asymmetric: SRT to VTT is lossless, VTT to SRT is not.

How to Convert an SRT File to VTT

  1. 1
    Load the subtitle file
    Drop your .srt file onto the converter above, or open it in any text editor and paste the contents in. The converter reads the first line to decide which direction you need — a file beginning with WEBVTT is converted to SubRip, anything else is converted to WebVTT — and you can override that with the direction buttons.
  2. 2
    Read what it says it changed
    Below the output the converter lists everything it did beyond swapping decimal separators: a byte-order mark removed, timestamps that had the wrong separator, cue settings or NOTE blocks that SubRip cannot hold. If a timestamp is malformed it stops and names the line number instead of writing a broken file.
  3. 3
    Download or copy the result
    Download names the file for you — the original basename with the new extension — and the Copy button puts the whole converted file on your clipboard. Then serve the .vtt file with a Content-Type of text/vtt and point a <track> element at it.

Conversion is instant and happens locally. Nothing is uploaded, so nothing is queued and there is no file-size cost to anyone but your own browser.

When Conversion Loses Information

SRT to VTT: nothing meaningful

Every construct SubRip has, WebVTT also has. Timings survive to the millisecond because both formats store milliseconds. The <i>, <b>, <u> and <font> tags SRT uses by convention are valid WebVTT markup, so cue text passes through untouched. The only changes are structural: the header line is added, commas become periods, and the numeric indices become optional identifiers — which this converter keeps by default, because they cost nothing and they make a diff between the two files readable.

One genuine edge case: WebVTT treats < and & as the start of markup. An SRT cue containing a bare < that is not a tag — a line of dialogue like 3 < 5 — is legal SRT and ambiguous WebVTT. It is rare enough that silently rewriting it would cause more surprises than it prevents, so this converter leaves your text exactly as you wrote it.

VTT to SRT: whatever the web-only parts said

Going the other way, anything WebVTT expresses that SubRip has no room for has to go. Cue settings — the positioning that put a caption at the top of the frame so it would not cover a lower third — are dropped, and the cue lands wherever the player puts cues. REGION and STYLE blocks and their ::cue CSS are dropped. NOTE comments are dropped. Class spans, language spans and ruby annotations are stripped. Inline karaoke timing tags are stripped, because SubRip times whole cues and never individual words, so there is nowhere for that timing to live.

Voice spans are the one case where deleting the markup would delete something the viewer actually needs. A cue reading <v Alex>we should ship it</v> loses the tag but keeps the name as a plain Alex: prefix. Losing the styling hook is a smaller loss than losing who spoke. Non-numeric cue identifiers are dropped too, and every cue is renumbered from 1 — a gap in SubRip numbering is one of the more common reasons a player quietly stops rendering the rest of a file.

The converter reports each of these under the output rather than performing them quietly. A converter that drops your caption positioning without saying so is worse than one that refuses, because you find out from a viewer.

Adding Subtitles to an HTML5 Video

Once you have a .vtt file, adding it to a video is one element. The <track> element goes inside <video>, and you can add one per language:

<video controls width="720" poster="poster.jpg">
  <source src="talk.mp4" type="video/mp4" />

  <!-- The browser will not load a .srt here. It must be WebVTT. -->
  <track
    src="/subtitles/talk.en.vtt"
    kind="captions"
    srclang="en"
    label="English"
    default
  />

  <track
    src="/subtitles/talk.es.vtt"
    kind="subtitles"
    srclang="es"
    label="Espanol"
  />
</video>
  • kindsubtitles is a translation for someone who can hear the audio; captions also carries speaker identification and non-speech sound, for someone who cannot. If your file is a transcript of what is said in the video's own language, captions is the honest value and the one assistive technology expects.
  • srclang — a BCP-47 language code (en, pt-BR). Required for subtitles. label is the human-readable name shown in the player's menu.
  • default — one track per video may carry it. Without it, no track is selected until the viewer opens the subtitle menu, which is why a correct .vtt file often looks like it did nothing.
  • Serve it as text/vtt — this is the most common server-side mistake. Some static hosts return text/plain for an unfamiliar extension and browsers refuse the track.
  • Cross-origin needs CORS — a track on a different domain (a CDN, an object store) requires CORS headers on the file and crossorigin="anonymous" on the <video> element. Testing over file:// fails for the same reason: browsers treat local files as cross-origin. Run a local server instead.

When the track is loading but nothing shows, the browser console usually says why in one line. When the console is silent and the menu is empty, suspect the BOM — the invisible three bytes some editors put in front of WEBVTT, which stop the parser recognising the signature. The converter on this page strips it.

Three Things That Silently Break a Subtitle File

  • The byte-order mark. "UTF-8 with BOM" is a default in several Windows editors. In SRT it usually shows up as a stray character before the first cue number; in WebVTT it hides the signature line and the whole file is rejected.
  • The wrong encoding. Older SRT files are frequently Windows-1252 or an ISO-8859 variant. Read as UTF-8, every accented character becomes a replacement character and cannot be recovered afterwards. WebVTT is UTF-8 by specification, with no alternative. If the converter above reports replacement characters, go back to the original file and re-save it as UTF-8 first.
  • The missing blank line. Both formats separate cues with a blank line and nothing else. Lose one and a strict parser reads two cues as one, or stops. This converter treats it as an error and names the line, rather than merging the cues and handing you something that looks fine until it plays.

Line endings, by contrast, are mostly a non-issue: the WebVTT specification accepts CRLF, LF and a bare CR, and SRT parsers accept all three in practice because there is no specification to say otherwise. The output here uses LF unless you ask for CRLF, which is worth doing only for older Windows tooling that parses the timing line by fixed offset.

What Valmera Does Instead — and What It Does Not Do

Plainly: Valmera does not import or export SRT or VTT files. This converter is a standalone utility on our site, not a feature of the editor. If your workflow needs a sidecar subtitle file at the end of it, Valmera will not produce one.

What Valmera does is burn captions into the picture. It transcribes your footage with word-level timings and renders the captions as part of the video: 11 presets, 12 bundled font families, karaoke word-pop, per-word emphasis and colour, entrance animations, and an editable transcript that re-renders the captions when you fix a word. None of that is expressible in a sidecar file, because a sidecar file is re-rendered by whatever player opens it, in that player's own style.

That is a real trade-off in both directions, and it is worth being clear about which side you need. Burned-in captions cannot be switched off, cannot be translated by the platform, and are not read by search engines — which is exactly why sidecar files exist. They also cannot be lost, are never mis-served with the wrong MIME type, and look the same everywhere, which is why social platforms are full of them. We wrote both sides up in burned-in captions vs. subtitles, and the caption feature itself is documented on add captions to video.

If what you actually need is the transcript in the first place — you have footage and no subtitle file at all — that is a different job from format conversion. See the auto subtitle generator, or the rest of the editing tools.

Frequently Asked Questions

Paste the SRT text into the converter on this page, or drop the .srt file onto it. The converter adds the required WEBVTT header line, changes every timestamp's comma decimal separator to a period, strips any byte-order mark, and leaves your cue text untouched. Then press Download to save the .vtt file. Nothing is uploaded — the conversion runs in your browser, so the file never leaves your machine.
No. The HTML5 <track> element only accepts WebVTT. Chrome, Safari, Firefox and Edge all reject a .srt file passed to <track>, and they do it silently — the video plays and the subtitle menu is simply empty, with the reason only visible in the console. This is the single most common reason people need an SRT to VTT converter at all.
SubRip (.srt) is a plain numbered list of cues with comma decimal separators and no positioning. WebVTT (.vtt) is a W3C format for the web: it starts with a WEBVTT signature line, uses a period as the decimal separator, makes the hours field and the cue identifier optional, and adds cue settings for positioning, NOTE comments, STYLE blocks with ::cue CSS, REGION blocks, voice spans, and per-word karaoke timing tags. WebVTT is a superset of what SRT can express, which is why SRT to VTT is lossless and VTT to SRT is not.
The file is never sent anywhere. The converter is JavaScript running in your own browser: it reads the file with the FileReader API, converts it in memory, and hands you the result as a download generated locally. There is no upload, no server-side processing, no account and no log. You can confirm it by disconnecting from the network and converting anyway — it still works.
Essentially nothing. Every construct SubRip has, WebVTT also has: the timings are identical to the millisecond, and the italic, bold, underline and font tags that SRT uses by convention are valid WebVTT markup too. The only changes are structural — a WEBVTT header line is added and the decimal separators become periods. The numeric cue indices become optional identifiers, and you can choose to keep or drop them.
Everything WebVTT can express that SubRip cannot: cue settings (align, line, position, size, vertical), REGION blocks, STYLE blocks and their ::cue CSS, NOTE comments, class spans, language spans, and inline karaoke timing tags. Voice spans lose their markup, but this converter keeps the speaker name as a plain "Name:" prefix rather than deleting it. Timings never change. The converter lists every one of these losses under the output instead of applying them quietly.
Five usual causes, in rough order of frequency. A byte-order mark sits in front of the WEBVTT signature so the parser never sees it (this converter strips BOMs). The server sends the file as text/plain instead of text/vtt. The track is on a different origin without CORS headers and a crossorigin attribute on the <video> element. No track has the default attribute, so nothing is selected until the viewer opens the subtitle menu. Or you are testing over file:// — browsers treat local files as cross-origin and refuse the track.
No. Valmera burns captions into the picture and does not import or export SRT or VTT. That is a real limitation and worth knowing before you sign up: if your workflow needs a sidecar subtitle file, Valmera is not the tool for that part of it. What it does instead is style captions per word — karaoke word-pop, per-word emphasis, 11 presets, 12 font families — which a sidecar file cannot carry, because the player re-renders a sidecar file in its own style.
No. There is no sign-up, no limit on how many files you convert, and no watermark or attribution added to the output. It is a static page with a few hundred lines of JavaScript on it.

The Editor Behind the Free Tool

Valmera is an agentic AI video editor: upload real footage, describe the edit in plain English, and an agent performs it. 50 free credits, no card. Captions are burned in — no SRT or VTT export.

Try the editor free →
See pricing →

Related Articles

Add Captions to Video
Word-accurate captions burned into the picture, styled per word — the other approach, and its trade-offs.
Burned-in Captions vs. Subtitles
When a sidecar file is the right answer and when it is not, without the marketing.
Auto Subtitle Generator
Generate the transcript in the first place, from the audio, with word-level timings.
Docs: Captions
Presets, fonts, animations and the editable transcript in the Valmera editor.