Convert SubRip captions to WebVTT, or back again, with the timings preserved exactly
The tool loads here. It needs JavaScript, because the work happens on your device.
Your files and your privacy
Caption files are read and rewritten inside this browser tab and are never uploaded, which
matters more than usual because subtitle files routinely carry unreleased dialogue. The
page’s Content-Security-Policy limits connect-src to this origin, and Clear data discards
the cues at once.
What this tool does
Convert a SubRip (.srt) caption file to WebVTT (.vtt) or back. The WEBVTT header is added
or removed, the millisecond separator is switched between a comma and a full stop, and
cues are renumbered contiguously. Timings are whole milliseconds, so a round trip is
exact.
Conversion parses the file into cues held as whole milliseconds from zero, then writes
them back out in the format you ask for, so the timings are exact in both directions.
Writing WebVTT puts the required WEBVTT line at the top, uses a full stop before the
milliseconds and emits each cue with no identifier line. Writing SubRip omits the header,
uses a comma and numbers the cues from 1 with no gaps.
How to use it
Select Choose an SRT or VTT file, or paste the cues straight in. The format is detected
from the WEBVTT header, so you do not declare it.
Read the cue count and the validation list: a cue whose timestamp could not be read is
named by number and is not in the loaded file.
Select Remove formatting tags first if you want plain text, which strips italics, voice
and positioning markup.
Set Convert to the format you want. It starts on the opposite of the one detected,
because converting a file to the format it already is rarely the intent.
Select Download converted subtitles, or Copy to paste the result somewhere else.
Example use cases
Attaching captions to an HTML5 video element, which expects WebVTT and shows nothing for
a SubRip file.
Preparing a file for a desktop player or a delivery workflow that accepts only .srt.
Renumbering a hand-edited SubRip file whose cue numbers have gaps or repeats.
Supported input and output
Accepts
SubRip (.srt) and WebVTT (.vtt) text files, read as UTF-8
Timestamps using a comma or a full stop before the milliseconds, with or without the
hours
Produces
WebVTT (.vtt) with the WEBVTT header, full-stop separator and no cue identifiers
SubRip (.srt) with a comma separator and cues numbered from 1
What this tool will not do
Only SubRip and WebVTT are read and written. ASS and SSA, TTML, SAMI and captions
embedded in a video container are not handled.
Cue identifiers are not preserved: everything before the timestamp line is discarded, so
SubRip output is renumbered from 1 and WebVTT output carries none.
NOTE comments and STYLE and REGION blocks in a WebVTT source are skipped on load and
appear in neither output.
Cue settings such as line:90% align:center are written after the end timestamp in
whichever format you export, including SubRip, which has no such feature, and nothing
drops them.
A timestamp whose minutes or seconds exceed 59 is treated as unreadable rather than
normalised, and that cue is skipped with its number reported.
Only UTF-8 is read reliably, and both outputs use LF line endings. Parsing runs on the
main thread, and the 10 MB size check is skipped for anything named .srt or .vtt, so an
unusually large file loads and blocks the page rather than being refused.
Common mistakes
Renaming a .srt file to .vtt. The header is still missing and the milliseconds still
carry a comma, and a browser then displays no captions without reporting an error.
Pressing the main download button out of habit. Download SRT is the primary action, so
asking for WebVTT and taking the default gives you the format you already had.
Assuming every cue reached the output. A block with an unreadable timestamp is reported
and skipped, so the file is short by those cues while looking well formed.
Loading a WebVTT file whose header an earlier tool stripped: it is detected as SubRip,
so a NOTE or STYLE block is read as a cue and reported as an error.
Technical notes
Every timestamp is converted once into an integer number of milliseconds, and both writers
format from that single representation, which is why converting back and forth returns the
original timings instead of accumulating rounding. The parser is tolerant on input and
strict on output: it accepts both separators whatever the file claims to be, accepts an
omitted hours component so that 01:30.000 means ninety seconds, normalises CRLF and lone
CR, strips a byte-order mark, and finds the timestamp line wherever it sits in the block.
Frequently asked questions
What actually differs between SRT and VTT?
A WebVTT file must begin with the word WEBVTT on its first line and SubRip has no
header; WebVTT writes 00:00:01.500 with a full stop while SubRip writes 00:00:01,500
with a comma; and SubRip numbers each cue, while a WebVTT identifier is optional and
need not be a number.
Can I just rename the file extension?
No. Renaming changes neither the missing header nor the comma before the milliseconds,
and a browser handed such a file usually displays nothing with no visible error.
What happens to comments, styling and cue numbers?
NOTE, STYLE and REGION blocks are skipped on load and are absent from the output. Cue
identifiers are discarded, so SubRip output is renumbered from 1 and WebVTT output has
none. Cue settings written after the end timestamp are kept and re-emitted in both
formats.