<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: OpenSubs</title>
    <description>The latest articles on DEV Community by OpenSubs (@opensubs).</description>
    <link>https://dev.to/opensubs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4129470%2F904c45b9-1294-446b-9e00-ae5c40bd7d4f.png</url>
      <title>DEV Community: OpenSubs</title>
      <link>https://dev.to/opensubs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/opensubs"/>
    <language>en</language>
    <item>
      <title>Captions vs subtitles: the difference that matters</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:56:54 +0000</pubDate>
      <link>https://dev.to/opensubs/captions-vs-subtitles-the-difference-that-matters-2fon</link>
      <guid>https://dev.to/opensubs/captions-vs-subtitles-the-difference-that-matters-2fon</guid>
      <description>&lt;p&gt;Ask for “subtitles” in London and “captions” in New York and you may well get the same file. The words really do mean different things, though, and the difference decides what you put in the text.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short answer
&lt;/h2&gt;

&lt;p&gt;The W3C’s accessibility guidance puts it about as plainly as it can be put. Captions are “a text version of the speech &lt;strong&gt;and non-speech audio information&lt;/strong&gt; needed to understand the content”. Subtitles are for “spoken audio translated into another language”.&lt;/p&gt;

&lt;p&gt;So the split is about what the viewer is missing. Captions assume you cannot hear the soundtrack, so they carry everything in it you would need — who is speaking, the knock at the door, the music that tells you this is the sad part. Subtitles assume you can hear perfectly well and simply do not speak the language, so the dialogue is enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Captions&lt;/th&gt;
&lt;th&gt;Subtitles&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Written for&lt;/td&gt;
&lt;td&gt;Someone who cannot hear the audio&lt;/td&gt;
&lt;td&gt;Someone who can hear it but does not speak the language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Usually the same as the speech&lt;/td&gt;
&lt;td&gt;A different one, translated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dialogue&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Who is speaking&lt;/td&gt;
&lt;td&gt;Marked when it is not obvious&lt;/td&gt;
&lt;td&gt;Not usually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sounds that matter&lt;/td&gt;
&lt;td&gt;Yes — the door, the siren, the music&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Also used by&lt;/td&gt;
&lt;td&gt;Anyone reading in a quiet office or a loud train&lt;/td&gt;
&lt;td&gt;Anyone learning the language&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why you keep seeing the words swapped
&lt;/h2&gt;

&lt;p&gt;Because in much of the world they are not separate words at all. The same W3C page notes that “the terms ‘captions’ and ‘subtitles’ are used for the same thing in different regions”. Where no distinction is made, everything is a subtitle, and the split people reach for instead is &lt;em&gt;intralingual&lt;/em&gt; — the same language as the speech — and &lt;em&gt;interlingual&lt;/em&gt;, translated.&lt;/p&gt;

&lt;p&gt;Which is worth knowing before you argue with a client about it. If someone in the UK asks for subtitles on an English-language video for a deaf audience, they are asking for what an American would call captions, and they are not using the word wrongly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closed and open: the other pair of words
&lt;/h2&gt;

&lt;p&gt;This one is about delivery rather than content, and it is the distinction that changes what you actually export. Most captions are &lt;strong&gt;closed&lt;/strong&gt;: they live in their own track or file and the viewer turns them on and off. &lt;strong&gt;Open&lt;/strong&gt; captions are drawn into the picture and cannot be switched off by anyone, ever.&lt;/p&gt;

&lt;p&gt;Neither is better. A platform with a player of its own — YouTube, Vimeo, a course site — wants a file, because a viewer who does not need the text can put it away. A feed that autoplays silently gives the viewer nothing to switch on, so the text has to be in the picture or it may as well not exist. A good deal of the time the answer is both: one version &lt;a href="https://opensubs.app/burn-subtitles-into-video" rel="noopener noreferrer"&gt;burned in&lt;/a&gt; for the feed, and a file for everywhere that will take one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it means for the file you make
&lt;/h2&gt;

&lt;p&gt;Captioning is mostly a writing job rather than a technical one. An &lt;a href="https://opensubs.app/blog/subtitle-file-formats" rel="noopener noreferrer"&gt;.srt file&lt;/a&gt; holds lines of text and their timings and nothing else, so a speaker label is just words at the front of a line, and a sound cue is just words in brackets. The convention most people follow is a name and a colon for the speaker, and square brackets for a sound — &lt;code&gt;[door slams]&lt;/code&gt;, &lt;code&gt;[soft piano]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Which means the same file can be either, depending on what you typed into it. Transcribe the speech and you have subtitles in the original language. Add who said it and what else could be heard, and you have captions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the words down first
&lt;/h2&gt;

&lt;p&gt;Either way the tedious part is the same: writing out what was said, in time with the video. OpenSubs does that in the browser — the speech is transcribed in the tab, the video is never uploaded, and you edit any line that came out wrong. From there you can translate it, add the speaker labels and sound cues a caption needs, and leave with an .srt, .vtt or .ass file, or with the text burned into the picture. The whole sequence, with the alternatives, is in &lt;a href="https://opensubs.app/blog/how-to-add-captions-to-a-video" rel="noopener noreferrer"&gt;how to add captions to a video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://opensubs.app/#app" rel="noopener noreferrer"&gt;Open the app&lt;/a&gt; · &lt;a href="https://opensubs.app/burn-subtitles-into-video" rel="noopener noreferrer"&gt;Burn them in instead&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Are captions and subtitles the same thing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not by the strict definition, but the words are used interchangeably in much of the world. Captions are a text version of the speech and the non-speech audio you need in order to follow what is happening; subtitles are the spoken audio put into another language. Where the distinction is not made, people say subtitles for both and separate them as intralingual and interlingual instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one do I need for YouTube or a social video?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a platform with its own player, upload a subtitle file and let the viewer switch it on: an .srt is the safe default. For a feed that autoplays without sound, burn the text into the picture instead, because there is nothing for a viewer to switch on. Many people do both — a burned-in version for the feed, a file for the platform that will take one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does OpenSubs make captions or subtitles?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It writes down the speech, which gives you the words either way, and it will translate them if you want subtitles in another language. What it does not do by itself is add speaker labels or note a sound that matters — those are captioning judgements, and you type them into the lines yourself in the editor.&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>video</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Word-by-Word Captions: How to Make Animated Subtitles</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:31:33 +0000</pubDate>
      <link>https://dev.to/opensubs/word-by-word-captions-how-to-make-animated-subtitles-1bj3</link>
      <guid>https://dev.to/opensubs/word-by-word-captions-how-to-make-animated-subtitles-1bj3</guid>
      <description>&lt;p&gt;You've seen them on every short-form feed: the caption sits on screen and each word lights up exactly as it's spoken. Karaoke captions, animated captions, word-by-word captions — same thing.&lt;/p&gt;

&lt;p&gt;They're not decoration. On a muted feed, the moving highlight tells the eye where in the line the speaker is, which keeps a viewer reading instead of scrolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Ordinary subtitles have one start and one end per cue. For word-by-word captions the renderer needs a moment for &lt;strong&gt;every word&lt;/strong&gt;, so it knows when to move the highlight.&lt;/p&gt;

&lt;p&gt;OpenSubs works those out from the cue itself: each cue has a start and an end, and the words in it are spread across that span. That is why the effect also works on a subtitle file you imported — it needs nothing more than the timings the file already has. Storing the result takes a format that can carry per-word timing, which is why this kind of caption is rendered from ASS files, or drawn straight into the picture, rather than from plain SRT — see &lt;a href="https://opensubs.app/blog/subtitle-file-formats" rel="noopener noreferrer"&gt;subtitle file formats&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use them — and when not to
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use them for&lt;/strong&gt; short-form video, talking-head clips, ads, anything watched on a phone with the sound off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skip them for&lt;/strong&gt; long-form video, lectures, interviews and documentary work. A highlight that never stops moving is tiring over ten minutes, and accessibility guidance favours steady, readable text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making them from your own video
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;OpenSubs&lt;/a&gt;, free and in the browser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt; and drop in your video. Nothing is uploaded.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate from the audio&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Read through and fix any wrong words — the highlight makes mistakes more noticeable, not less.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Word effects&lt;/strong&gt;, choose &lt;strong&gt;Highlight each word as it is spoken&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pick a &lt;a href="https://opensubs.app/styles" rel="noopener noreferrer"&gt;caption style&lt;/a&gt;. The heavy, high-contrast presets suit this effect best.&lt;/li&gt;
&lt;li&gt;Preview it over your own footage, then click &lt;strong&gt;Burn subtitles into the video&lt;/strong&gt; and save the MP4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There's a second effect in the same place — &lt;strong&gt;Size every word by how loud it was&lt;/strong&gt; — which grows the words that were emphasised. Because it needs the audio, it's only offered for subtitles this app transcribed; highlighting works on imported subtitles too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting them to look right
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep cues short.&lt;/strong&gt; A few words at a time. A long line with one word lit up is hard to follow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contrast first.&lt;/strong&gt; The highlight colour has to beat the footage behind it; an outline or a solid box behind the text helps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't put the captions where the app's interface goes&lt;/strong&gt; — the right-hand buttons and the bottom strip on Reels and TikTok.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preview on the real footage&lt;/strong&gt;, not on a plain background. Busy shots are where captions fail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Exporting
&lt;/h2&gt;

&lt;p&gt;For social, burn the captions in: platforms like Instagram and TikTok don't take subtitle files, and the effect has to be in the picture anyway. See &lt;a href="https://opensubs.app/blog/add-subtitles-to-mp4" rel="noopener noreferrer"&gt;adding subtitles to an MP4&lt;/a&gt; and &lt;a href="https://opensubs.app/blog/subtitles-for-reels-and-tiktok" rel="noopener noreferrer"&gt;subtitles for Reels and TikTok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want a file rather than a burned-in video, export &lt;code&gt;.ass&lt;/code&gt;: the style table travels with it, and renderers such as VLC and mpv will draw it. Open it in your player and check before you rely on it — how much of the word-by-word effect survives depends on the renderer.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I need After Effects or a paid captions app?
&lt;/h3&gt;

&lt;p&gt;No. The effect is standard subtitle rendering; a browser tab can do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will it work on subtitles I already have?
&lt;/h3&gt;

&lt;p&gt;Highlighting works with imported &lt;code&gt;.srt&lt;/code&gt; / &lt;code&gt;.vtt&lt;/code&gt; files. Sizing words by loudness needs the audio, so it's only available when the app transcribed the video itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is there a watermark?
&lt;/h3&gt;

&lt;p&gt;No, and no account either.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it work for languages other than English?
&lt;/h3&gt;

&lt;p&gt;Yes, for the languages the model recognises. Long CJK lines are worth checking in the preview before you export.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I still turn the captions off later?
&lt;/h3&gt;

&lt;p&gt;Not once they're burned in. Keep the subtitle file if you might need a clean version.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;Try word-by-word captions →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>animation</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Add Subtitles to Instagram Reels and TikTok Videos</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:30:52 +0000</pubDate>
      <link>https://dev.to/opensubs/how-to-add-subtitles-to-instagram-reels-and-tiktok-videos-2l1i</link>
      <guid>https://dev.to/opensubs/how-to-add-subtitles-to-instagram-reels-and-tiktok-videos-2l1i</guid>
      <description>&lt;p&gt;Short-form video is watched muted. Captions aren't an accessibility extra there — they're how the video gets understood at all.&lt;/p&gt;

&lt;p&gt;Both apps have their own auto-caption feature, and both have the same three limits: the captions only exist inside that app, the styling is whatever they offer, and you have to upload the video before you can see them. If you want the same captions on Reels, TikTok, Shorts and your own site, the text has to be in the picture before you upload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why you can't just upload an .srt
&lt;/h2&gt;

&lt;p&gt;Instagram and TikTok don't accept subtitle files. YouTube does accept one for a regular video upload — but on a feed that autoplays muted, a caption track the viewer has to switch on doesn't help you.&lt;/p&gt;

&lt;p&gt;So for short-form: &lt;strong&gt;burn the captions in&lt;/strong&gt;. See &lt;a href="https://opensubs.app/blog/add-subtitles-to-mp4" rel="noopener noreferrer"&gt;separate file vs burned in&lt;/a&gt; for when each one applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step by step, free and without uploading
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;OpenSubs&lt;/a&gt; runs in a browser tab, so the clip stays on your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Export your vertical clip first
&lt;/h3&gt;

&lt;p&gt;Cut and frame the video however you normally do — phone, CapCut, Premiere — and export it at 9:16. OpenSubs draws captions onto the video you give it; it doesn't reframe or crop, so do that first.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Open it in OpenSubs
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt; and choose the file. Nothing is uploaded.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Generate the captions
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Generate from the audio&lt;/strong&gt;. Speech recognition runs on your own machine; the language is detected automatically. A 30-second clip is quick.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Read them through
&lt;/h3&gt;

&lt;p&gt;Short-form is dense and fast, and names and slang are where automatic transcripts slip. Fix any line by typing in it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Pick a style built for a phone screen
&lt;/h3&gt;

&lt;p&gt;Choose a &lt;a href="https://opensubs.app/styles" rel="noopener noreferrer"&gt;caption style&lt;/a&gt; — the big, heavy presets are the ones that hold up on a small screen. A couple of things worth doing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turn on word-by-word highlighting&lt;/strong&gt; if you want the bouncing-word look that short-form audiences are used to. See &lt;a href="https://opensubs.app/blog/word-by-word-captions" rel="noopener noreferrer"&gt;word-by-word captions&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep captions clear of the interface.&lt;/strong&gt; Both apps put buttons down the right side and text along the bottom; anything in those zones gets covered.&lt;/li&gt;
&lt;li&gt;Preview it over your own footage before you export — what you see is what gets drawn.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Burn and post
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Burn subtitles into the video&lt;/strong&gt;, save the MP4, and upload that. No watermark, no account.&lt;/p&gt;

&lt;p&gt;If you also want the subtitle file — for a YouTube upload of the same cut, or for translation — export the &lt;code&gt;.srt&lt;/code&gt; at the same time. The timings match.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posting the same clip in another language
&lt;/h2&gt;

&lt;p&gt;Translate the subtitles before burning: pick a target language, and in Chrome the translation runs on your device at no cost. You can either replace the original text or keep both lines on screen, which is common for creators posting to two audiences at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caption habits that work in short-form
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short cues.&lt;/strong&gt; A few words at a time, matching the pace of the speech.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High contrast.&lt;/strong&gt; White text with an outline, or a solid box behind it, survives busy footage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the top and bottom strips clear&lt;/strong&gt; — that is where both apps put their own text and buttons.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't caption every "um".&lt;/strong&gt; Clean it up while you're reading through.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does OpenSubs crop my video to 9:16?
&lt;/h3&gt;

&lt;p&gt;No. Export the vertical version first; OpenSubs adds the captions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will there be a watermark?
&lt;/h3&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use it on a phone?
&lt;/h3&gt;

&lt;p&gt;The app runs in a browser and the encoding is heavy; a laptop or desktop is the realistic way to do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are my videos uploaded anywhere?
&lt;/h3&gt;

&lt;p&gt;No. Transcription and burning both run in your browser tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I edit the captions after burning them in?
&lt;/h3&gt;

&lt;p&gt;Not in the exported MP4 — they're part of the picture. Keep the subtitle file and re-export.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;Caption your Reel or TikTok →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>socialmedia</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Add Subtitles to an MP4: Separate File vs Burned In</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:30:11 +0000</pubDate>
      <link>https://dev.to/opensubs/how-to-add-subtitles-to-an-mp4-separate-file-vs-burned-in-56pc</link>
      <guid>https://dev.to/opensubs/how-to-add-subtitles-to-an-mp4-separate-file-vs-burned-in-56pc</guid>
      <description>&lt;p&gt;"Add subtitles to an MP4" means one of two quite different things, and picking the wrong one wastes an export.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keep them separate.&lt;/strong&gt; The subtitles stay in their own &lt;code&gt;.srt&lt;/code&gt; file next to the video. The player draws them, and the viewer can switch them off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burn them in.&lt;/strong&gt; The text is drawn into the picture during an export. It's part of the image from then on — no switching off, no player support needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's how to decide, and how to do each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one do you need?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Separate &lt;code&gt;.srt&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;Burned in&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Viewer can turn them off&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on Instagram, TikTok, Reels&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works on YouTube, Vimeo&lt;/td&gt;
&lt;td&gt;yes, upload as a track&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works in VLC and most desktop players&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Survives re-uploads and downloads&lt;/td&gt;
&lt;td&gt;often lost&lt;/td&gt;
&lt;td&gt;always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You can fix a typo later&lt;/td&gt;
&lt;td&gt;edit the text file&lt;/td&gt;
&lt;td&gt;re-export the video&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quality cost&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;one more video encode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rule of thumb: &lt;strong&gt;social feeds need burned-in text; anywhere you can upload a subtitle track, keep it separate.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 1: keep the subtitles as a separate file
&lt;/h2&gt;

&lt;p&gt;Put the &lt;code&gt;.srt&lt;/code&gt; in the same folder as the video and give it the same name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;holiday.mp4
holiday.srt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most desktop players pick that up on their own. If not, every player has a menu for loading a subtitle file manually. For YouTube or Vimeo, upload the video first, then attach the &lt;code&gt;.srt&lt;/code&gt; as a subtitle track.&lt;/p&gt;

&lt;p&gt;Two things go wrong often enough to name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The subtitles drift out of sync.&lt;/strong&gt; The file was made for a different cut. Use your player's subtitle delay setting, or a file matching your exact version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-Latin text comes out as nonsense.&lt;/strong&gt; The encoding doesn't match; re-save the file as UTF-8.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a middle option: &lt;em&gt;muxing&lt;/em&gt; the subtitle track inside the container, so one file carries both. MKV is the usual home for that; support for subtitle tracks inside MP4 varies from player to player, which is why the two practical options are the ones above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option 2: burn the subtitles into the picture
&lt;/h2&gt;

&lt;p&gt;Burning re-encodes the video with the text drawn on top. That's what you want for Instagram, TikTok and Shorts, and for anything you send to people who shouldn't have to fiddle with settings.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;OpenSubs&lt;/a&gt; this is all in the browser:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt; and drop in your MP4.&lt;/li&gt;
&lt;li&gt;Generate the subtitles from the audio, or open an &lt;code&gt;.srt&lt;/code&gt; / &lt;code&gt;.vtt&lt;/code&gt; you already have.&lt;/li&gt;
&lt;li&gt;Fix any lines that came out wrong, and pick a &lt;a href="https://opensubs.app/styles" rel="noopener noreferrer"&gt;caption style&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Clip &amp;amp; size&lt;/strong&gt;, set a start and end if you only want part of the video, and choose the output resolution.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Burn subtitles into the video&lt;/strong&gt; and save the MP4.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The encoding happens on your machine — the video is never uploaded — and the result has no watermark. There's a longer walkthrough on &lt;a href="https://opensubs.app/burn-subtitles-into-video" rel="noopener noreferrer"&gt;burning subtitles into video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you'd rather do it on the command line, ffmpeg burns a subtitle file into a video with its &lt;code&gt;subtitles&lt;/code&gt; filter; for styled output, export &lt;code&gt;.ass&lt;/code&gt; first so the look travels with the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing both
&lt;/h2&gt;

&lt;p&gt;Nothing stops you from shipping both: the burned-in MP4 for social, and the separate &lt;code&gt;.srt&lt;/code&gt; for YouTube, for a client's editor, or for translation later. Export the subtitle file once and reuse it — the timings are the same either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Will burning in reduce quality?
&lt;/h3&gt;

&lt;p&gt;The video is encoded again, so in theory yes; at sensible settings the difference is hard to see. The subtitle text itself stays sharp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I turn burned-in subtitles off later?
&lt;/h3&gt;

&lt;p&gt;No. They're part of the picture. Keep the &lt;code&gt;.srt&lt;/code&gt; so you can re-export if you need a clean version.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why don't my subtitles show up on Instagram when I upload the .srt?
&lt;/h3&gt;

&lt;p&gt;Instagram and TikTok don't accept subtitle files from you. Burn them in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I add subtitles to an MP4 without re-encoding it?
&lt;/h3&gt;

&lt;p&gt;Only by keeping them separate, or by putting them into an MKV. Drawing them into the picture always means an encode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to install anything?
&lt;/h3&gt;

&lt;p&gt;No. Both routes above work in a browser tab.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;Add subtitles to your MP4 →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>How to Add Captions to a Video (Free, Without Uploading It)</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:29:17 +0000</pubDate>
      <link>https://dev.to/opensubs/how-to-add-captions-to-a-video-free-without-uploading-it-3i29</link>
      <guid>https://dev.to/opensubs/how-to-add-captions-to-a-video-free-without-uploading-it-3i29</guid>
      <description>&lt;p&gt;Captions get watched. Most feeds start videos muted, and a viewer who can't turn the sound on will scroll past a video that doesn't show its words. They're also how deaf and hard-of-hearing viewers get in at all.&lt;/p&gt;

&lt;p&gt;There are three ways to put &lt;a href="https://opensubs.app/blog/caption-vs-subtitle" rel="noopener noreferrer"&gt;captions&lt;/a&gt; on a video. Here's each one, and then the fastest route that doesn't involve uploading your footage anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three routes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;What it costs&lt;/th&gt;
&lt;th&gt;Good for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Type them yourself&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Many times the length of the video&lt;/td&gt;
&lt;td&gt;Short clips, or when the wording has to be exact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Let the platform do it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free, but only on that platform, and your video sits on their servers&lt;/td&gt;
&lt;td&gt;Video that lives on YouTube anyway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Generate them on your machine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A few minutes of your computer's time&lt;/td&gt;
&lt;td&gt;Anything you'd rather not upload, and any platform&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Route 1: type them yourself
&lt;/h2&gt;

&lt;p&gt;Open the video, write down what's said, mark the times. Any text editor works — an SRT file is just numbers, times and lines (see &lt;a href="https://opensubs.app/blog/subtitle-file-formats" rel="noopener noreferrer"&gt;subtitle file formats&lt;/a&gt;). Dedicated editors such as Aegisub or Subtitle Edit make the timing part less painful.&lt;/p&gt;

&lt;p&gt;It's accurate and it's slow. Most people do this only to fix a transcript they got some other way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route 2: let the platform do it
&lt;/h2&gt;

&lt;p&gt;YouTube generates captions for uploaded videos automatically, and the editors in Instagram, TikTok and CapCut can add them too.&lt;/p&gt;

&lt;p&gt;Two catches. The captions live on that platform — taking them elsewhere means exporting and reformatting — and the video has to be uploaded first, which you may not want for a client recording, a lecture, or anything unreleased.&lt;/p&gt;

&lt;h2&gt;
  
  
  Route 3: generate them on your own machine
&lt;/h2&gt;

&lt;p&gt;Speech recognition now runs in a browser tab. The model downloads once, the audio is read from your disk, and the transcript comes back without the video going anywhere.&lt;/p&gt;

&lt;p&gt;Here's the whole thing in &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;OpenSubs&lt;/a&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Drop in the video
&lt;/h3&gt;

&lt;p&gt;Open &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt; and choose a video file. Nothing is uploaded — there is no upload endpoint in the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Generate the subtitles
&lt;/h3&gt;

&lt;p&gt;Pick a model — the smallest is around 40 MB, the largest around 250 MB — and click &lt;strong&gt;Generate from the audio&lt;/strong&gt;. The model downloads once and is cached for next time. The spoken language is detected automatically, or you can set it yourself.&lt;/p&gt;

&lt;p&gt;How long it takes depends on the model you picked and the machine you are on; a machine with WebGPU is faster than one without.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Fix the lines
&lt;/h3&gt;

&lt;p&gt;Automatic transcripts get names, jargon and acronyms wrong. Read through and correct any line by typing in it. This is the step people skip, and it's the one that separates captions that help from captions that annoy.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Translate, if you need to
&lt;/h3&gt;

&lt;p&gt;Pick a target language and the subtitles are translated without touching the timings. In Chrome this runs on your device at no cost, using the browser's built-in translation. You can show the translation on its own, or keep the original above or below it for bilingual captions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Style them
&lt;/h3&gt;

&lt;p&gt;Choose a caption style — plain white text, boxed text, big social-video lettering, or &lt;a href="https://opensubs.app/blog/word-by-word-captions" rel="noopener noreferrer"&gt;word-by-word highlighting&lt;/a&gt; — and preview it over your own footage. What the preview shows is what gets rendered.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Export
&lt;/h3&gt;

&lt;p&gt;Two kinds of output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A subtitle file&lt;/strong&gt; — &lt;code&gt;.srt&lt;/code&gt;, &lt;code&gt;.vtt&lt;/code&gt; or &lt;code&gt;.ass&lt;/code&gt;. Upload it alongside your video to YouTube or Vimeo, or keep it next to the file so your player picks it up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An MP4 with the captions drawn into the picture&lt;/strong&gt; — for Instagram, TikTok and anywhere else that won't take a subtitle file. &lt;a href="https://opensubs.app/blog/add-subtitles-to-mp4" rel="noopener noreferrer"&gt;Which of the two you want&lt;/a&gt; depends on where the video is going.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's free, there's no account and no watermark, and the source code is published under AGPL-3.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing captions people can actually read
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two lines at a time, at most.&lt;/strong&gt; Three lines cover the picture and lose the reader.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break lines where the sentence breaks&lt;/strong&gt; — after a clause, not between an adjective and its noun.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leave them on screen long enough.&lt;/strong&gt; A cue that flashes by in a third of a second is noise.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Caption the meaningful sounds too&lt;/strong&gt; when they matter: &lt;code&gt;[laughs]&lt;/code&gt;, &lt;code&gt;[phone rings]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check names and numbers by hand.&lt;/strong&gt; That's where automatic transcripts fail most often.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Do I have to upload my video?
&lt;/h3&gt;

&lt;p&gt;Not with a browser-based tool. OpenSubs reads the file from your disk and runs speech recognition in the tab.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it really free?
&lt;/h3&gt;

&lt;p&gt;Yes — no account, no watermark. There's an optional mode where you plug in your own API key and the audio goes to a paid service you choose; it's off by default.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which format should I upload to YouTube?
&lt;/h3&gt;

&lt;p&gt;SRT. Upload the video, then attach the &lt;code&gt;.srt&lt;/code&gt; as a subtitle track.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I caption an audio file?
&lt;/h3&gt;

&lt;p&gt;Not in OpenSubs — the file picker takes video only. Put the audio into a video container first if you need to.&lt;/p&gt;

&lt;h3&gt;
  
  
  How accurate is it?
&lt;/h3&gt;

&lt;p&gt;It depends on the model size and the audio: accents, overlapping speakers and background music all make it worse. Read through before you publish.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;Caption your video now →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>video</category>
      <category>a11y</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>How to Convert SRT to VTT (and Back) for Free</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Mon, 21 Sep 2026 02:29:12 +0000</pubDate>
      <link>https://dev.to/opensubs/how-to-convert-srt-to-vtt-and-back-for-free-e87</link>
      <guid>https://dev.to/opensubs/how-to-convert-srt-to-vtt-and-back-for-free-e87</guid>
      <description>&lt;p&gt;You have an &lt;code&gt;.srt&lt;/code&gt; subtitle file, and the thing you're uploading it to wants &lt;code&gt;.vtt&lt;/code&gt;. Most often that's a web video player: the HTML5 &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt; element only reads WebVTT.&lt;/p&gt;

&lt;p&gt;The two formats are close enough that the conversion takes a few seconds — but not so close that renaming the file works. Here's what actually changes, and the fastest way to do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convert SRT to VTT in your browser
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Subtitles&lt;/strong&gt;, click &lt;strong&gt;Or open an .srt / .vtt you already have&lt;/strong&gt; and pick your file. You don't need to load a video.&lt;/li&gt;
&lt;li&gt;Scroll to &lt;strong&gt;Export&lt;/strong&gt; and click &lt;strong&gt;.vtt&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Your file downloads as WebVTT, with the timings unchanged.&lt;/p&gt;

&lt;p&gt;The file is read by your browser and never uploaded — OpenSubs has no upload endpoint. There's no account, and it's free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Convert VTT to SRT
&lt;/h2&gt;

&lt;p&gt;The same steps work in reverse:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;opensubs.app&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Or open an .srt / .vtt you already have&lt;/strong&gt; and pick your &lt;code&gt;.vtt&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Export&lt;/strong&gt;, click &lt;strong&gt;.srt&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You get a numbered SubRip file with commas in the timestamps — the version most video editors and desktop players expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually changes between SRT and VTT
&lt;/h2&gt;

&lt;p&gt;Here is the same subtitle in both formats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SRT&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
00:01:42,300 --&amp;gt; 00:01:45,120
Thanks for watching,
see you next week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;VTT&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WEBVTT

00:01:42.300 --&amp;gt; 00:01:45.120
Thanks for watching,
see you next week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three differences matter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The header.&lt;/strong&gt; A VTT file must start with the line &lt;code&gt;WEBVTT&lt;/code&gt;. Without it, browsers reject the whole file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The decimal separator.&lt;/strong&gt; SRT writes milliseconds after a comma (&lt;code&gt;00:01:42,300&lt;/code&gt;). VTT uses a period (&lt;code&gt;00:01:42.300&lt;/code&gt;). Get this wrong and the player silently shows nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cue numbers.&lt;/strong&gt; SRT numbers every subtitle. In VTT the number is optional, so converters usually drop it.&lt;/p&gt;

&lt;p&gt;That's why renaming &lt;code&gt;film.srt&lt;/code&gt; to &lt;code&gt;film.vtt&lt;/code&gt; doesn't work: the header is missing and every timestamp uses the wrong separator.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use which
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SRT&lt;/th&gt;
&lt;th&gt;VTT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web players (HTML5 &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop players like VLC&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video editors&lt;/td&gt;
&lt;td&gt;✓ usually&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling and positioning&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;some, via cue settings&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A good rule: use &lt;strong&gt;VTT for anything on the web&lt;/strong&gt;, and &lt;strong&gt;SRT for everything else&lt;/strong&gt; — it's the format almost every tool accepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it by hand
&lt;/h2&gt;

&lt;p&gt;For a short file, you can convert in any text editor:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add &lt;code&gt;WEBVTT&lt;/code&gt; and an empty line at the very top.&lt;/li&gt;
&lt;li&gt;Find and replace the comma in every timestamp with a period. Replace only inside timestamps — a plain find-and-replace on &lt;code&gt;,&lt;/code&gt; will also break the commas in your dialogue.&lt;/li&gt;
&lt;li&gt;Save the file with a &lt;code&gt;.vtt&lt;/code&gt; extension, as UTF-8.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For anything longer than a few lines, step 2 is where mistakes creep in, which is why a converter is safer.&lt;/p&gt;

&lt;h2&gt;
  
  
  While your subtitles are open
&lt;/h2&gt;

&lt;p&gt;Once the file is loaded in OpenSubs, you can do more before exporting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Translate&lt;/strong&gt; it into 20 languages without touching the timings.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix a line&lt;/strong&gt; by editing its text directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restyle it.&lt;/strong&gt; Pick a &lt;a href="https://opensubs.app/styles" rel="noopener noreferrer"&gt;caption style&lt;/a&gt;, including word-by-word highlighting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burn it into a video&lt;/strong&gt;: load the video and export an MP4 with the subtitles drawn into the picture — useful for Instagram and TikTok, which don't take subtitle files. See &lt;a href="https://opensubs.app/burn-subtitles-into-video" rel="noopener noreferrer"&gt;how to burn subtitles into a video&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't have a subtitle file yet? You can &lt;a href="https://opensubs.app/subtitle-sites" rel="noopener noreferrer"&gt;download one&lt;/a&gt; if someone has made it, or generate one from the video's own audio.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Will converting change my subtitle timings?
&lt;/h3&gt;

&lt;p&gt;No. Only the format changes; every start and end time stays the same.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I convert VTT back to SRT?
&lt;/h3&gt;

&lt;p&gt;Yes. Open the &lt;code&gt;.vtt&lt;/code&gt; file and export as &lt;code&gt;.srt&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is my subtitle file uploaded?
&lt;/h3&gt;

&lt;p&gt;No. OpenSubs reads the file in your browser tab. There is no upload endpoint in the product.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it cost anything?
&lt;/h3&gt;

&lt;p&gt;No. Converting, translating on your device and exporting are free, with no account.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app/" rel="noopener noreferrer"&gt;Convert your file now →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>video</category>
      <category>tutorial</category>
      <category>html</category>
    </item>
    <item>
      <title>Subtitle File Formats: SRT, VTT and ASS Explained</title>
      <dc:creator>OpenSubs</dc:creator>
      <pubDate>Thu, 17 Sep 2026 12:00:42 +0000</pubDate>
      <link>https://dev.to/opensubs/subtitle-file-formats-srt-vtt-and-ass-explained-3bc8</link>
      <guid>https://dev.to/opensubs/subtitle-file-formats-srt-vtt-and-ass-explained-3bc8</guid>
      <description>&lt;p&gt;A subtitle file is a plain text file: lines of dialogue, each with a start and an end time. The format decides how much more than that it can carry — styling, positioning, word timing — and which players will accept it.&lt;/p&gt;

&lt;p&gt;Three formats cover almost everything you'll meet: &lt;strong&gt;SRT&lt;/strong&gt;, &lt;strong&gt;VTT&lt;/strong&gt; and &lt;strong&gt;ASS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SRT — the one everything accepts
&lt;/h2&gt;

&lt;p&gt;SubRip (&lt;code&gt;.srt&lt;/code&gt;) is the oldest and the most widely supported. A cue is a number, a time range, and the text:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1
00:01:42,300 --&amp;gt; 00:01:45,120
Thanks for watching,
see you next week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all it holds. No colours, no fonts, no positions — the player decides how it looks. Milliseconds come after a &lt;strong&gt;comma&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when&lt;/strong&gt; you want a file that simply works: desktop players, video editors, TV boxes, most upload forms.&lt;/p&gt;

&lt;h2&gt;
  
  
  VTT — the web format
&lt;/h2&gt;

&lt;p&gt;WebVTT (&lt;code&gt;.vtt&lt;/code&gt;) was written for the browser. The HTML5 &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt; element reads this format and no other, so a player on a web page needs VTT.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WEBVTT

00:01:42.300 --&amp;gt; 00:01:45.120
Thanks for watching,
see you next week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three differences from SRT: the file must start with &lt;code&gt;WEBVTT&lt;/code&gt;, milliseconds come after a &lt;strong&gt;period&lt;/strong&gt;, and cue numbers are optional. VTT can also carry cue settings — position, line, alignment — and simple styling through CSS in the page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when&lt;/strong&gt; the subtitles will play in a browser. See &lt;a href="https://opensubs.app/blog/srt-to-vtt" rel="noopener noreferrer"&gt;how to convert SRT to VTT&lt;/a&gt; if you already have the SRT.&lt;/p&gt;

&lt;h2&gt;
  
  
  ASS — the one that carries the look
&lt;/h2&gt;

&lt;p&gt;Advanced SubStation Alpha (&lt;code&gt;.ass&lt;/code&gt;) is a different kind of file. Besides the dialogue it stores a style table: font, size, colours, outline and shadow, margins, alignment. Every line points at a style.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, OutlineColour, ...
Style: Default,Inter,43,&amp;amp;H00FFFFFF,&amp;amp;H4D100C0C,...

[Events]
Dialogue: 0,0:01:42.30,0:01:45.12,Default,,0,0,0,,Thanks for watching,\Nsee you next week.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the look travels with the file, ASS is what subtitle renderers use when subtitles are drawn into a video, and what fansubbing and karaoke tooling has always used. It also supports word-level timing, which is how word-by-word highlighting is done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it when&lt;/strong&gt; the styling matters and the player supports it (VLC and mpv do), or when you're handing the file to something that will render it into the picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SRT&lt;/th&gt;
&lt;th&gt;VTT&lt;/th&gt;
&lt;th&gt;ASS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Text and timings&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling stored in the file&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;limited, via CSS&lt;/td&gt;
&lt;td&gt;yes, full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes, cue settings&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Word-level timing&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML5 &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VLC / mpv&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Video editors&lt;/td&gt;
&lt;td&gt;usually&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;rarely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Upload forms (YouTube, Vimeo, socials)&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;often&lt;/td&gt;
&lt;td&gt;rarely&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Which one should you pick?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Uploading to a platform&lt;/strong&gt; — SRT. It's the safe default; YouTube, Vimeo and most others take it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A player on your own web page&lt;/strong&gt; — VTT.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You want your styling to survive&lt;/strong&gt; — ASS, or skip the file entirely and burn the subtitles into the picture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handing subtitles to an editor or a colleague&lt;/strong&gt; — SRT, plus a note about the styling you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What about the other extensions?
&lt;/h2&gt;

&lt;p&gt;You'll also run into &lt;code&gt;.ssa&lt;/code&gt; (the older version of ASS), &lt;code&gt;.sub&lt;/code&gt; (several unrelated formats, some counted in frames rather than in time), &lt;code&gt;.ttml&lt;/code&gt; and &lt;code&gt;.dfxp&lt;/code&gt; (XML, used in broadcast and by some platforms), and &lt;code&gt;.sbv&lt;/code&gt; (YouTube's own export). They exist, but for everyday work the three above cover it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting a file in the format you need
&lt;/h2&gt;

&lt;p&gt;OpenSubs runs in your browser and exports all three. You can start from an existing subtitle file or from the video itself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open an &lt;code&gt;.srt&lt;/code&gt; or &lt;code&gt;.vtt&lt;/code&gt; you already have, then export &lt;code&gt;.srt&lt;/code&gt;, &lt;code&gt;.vtt&lt;/code&gt; or &lt;code&gt;.ass&lt;/code&gt; — no video needed.&lt;/li&gt;
&lt;li&gt;Or drop in a video and let it transcribe the speech on your own machine, with nothing uploaded, then export.&lt;/li&gt;
&lt;li&gt;Pick a &lt;a href="https://opensubs.app/styles" rel="noopener noreferrer"&gt;caption style&lt;/a&gt; before exporting ASS, so the look is written into the file.&lt;/li&gt;
&lt;li&gt;Or export an MP4 with the subtitles &lt;a href="https://opensubs.app/burn-subtitles-into-video" rel="noopener noreferrer"&gt;burned into the picture&lt;/a&gt;, for places that don't take subtitle files at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I just rename an .srt to .vtt?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. VTT needs the &lt;code&gt;WEBVTT&lt;/code&gt; header and periods instead of commas in the timestamps. Renaming leaves the file unreadable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does converting change the timings?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Only the format changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will ASS styling show up everywhere?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No. Players that use a subtitle renderer, such as VLC and mpv, draw it; most web players and editors ignore it. If the look has to survive everywhere, burn the subtitles into the video.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which format should I upload to YouTube?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SRT. YouTube ignores styling anyway.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://opensubs.app" rel="noopener noreferrer"&gt;Convert or create subtitles →&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>video</category>
      <category>tutorial</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
