How to add subtitles to an MP4

There are two genuinely different answers, and picking the wrong one is the usual cause of frustration. You can keep the subtitles as a separate file that the player loads alongside the video, or you can burn them into the picture so they are part of the image forever. This page explains which one you want, then walks through producing it — free, in your browser, without the video being uploaded anywhere.

Both routes start in the same place

Generate the subtitles first, then choose. No account, no watermark.

Add subtitles to your MP4 →

Route 1: a sidecar subtitle file

You end up with two files — talk.mp4 and talk.srt — and the player pairs them. VLC, mpv, Plex, Jellyfin and most smart TVs pick up a subtitle file automatically if it sits in the same folder with the same base name. Web pages load one through a <track> element.

This is the better default, for three reasons. The subtitles stay switchable, so a viewer who does not want them can turn them off. They stay editable — spot a typo six months later and you fix a text file instead of re-exporting a video. And the video itself is bit-for-bit untouched, with no quality cost at all.

The catch is that the subtitles only exist where the file goes with them. Send someone just the MP4 and the captions vanish.

Route 2: burned in (hardsubs)

Here the video is decoded, the text is drawn onto each frame, and the result is re-encoded into a new MP4. The subtitles are now pixels, indistinguishable from the rest of the image. Every player on earth displays them, because there is nothing to display — they are just part of the picture.

That universality is the entire argument for burn-in, and it is a strong one when you are posting to a platform that will not accept a caption file or when you have no idea what the viewer will play it in. The costs are equally concrete:

Always keep the original file.

Which route for where

DestinationUseWhy
YouTubeSidecar SRTAccepts subtitle uploads, indexes the text, and lets viewers toggle and auto-translate it.
VimeoSidecar SRT/VTTNative caption-track support.
A web page you controlSidecar VTTWhat <track kind="subtitles"> expects.
Instagram, TikTok, Reels, ShortsBurned inFeed video is watched muted and silently; you cannot rely on a caption track being honoured.
LinkedIn, XBurned inCaption-file support is inconsistent; burned-in text always shows.
Email, Slack, a USB stickBurned inA loose sidecar file will get separated from the video.
Your own media librarySidecar SRTSwitchable, editable, zero quality loss.
A video editor (Premiere, Resolve, Final Cut)Sidecar SRTImport it as a caption track and style it with the editor’s own tools.

Doing it

  1. Open the tool and pick a Whisper model. Nothing is downloaded until you click one. Base is the sensible default; see the model comparison if the audio is difficult or not in English.
  2. Drag the MP4 in and transcribe. The file is read off your disk and never sent anywhere. Speech recognition runs in a Web Worker so the page stays usable while it works.
  3. Edit the text, with the preview on. This is the step people skip and regret. The video player shows the subtitles live as you type, so you can check line lengths and catch misheard proper nouns against the picture. If you are burning in, do this now — afterwards is too late.
  4. Optionally translate. Finished subtitles can be translated to English or Swedish. This requires the spoken language to be set explicitly rather than left on Auto-detect.
  5. Export. Download .srt or .vtt for the sidecar route, or Burn Subtitles & Export MP4 for hardsubs. Burn-in runs ffmpeg compiled to WebAssembly, locally, and returns a new MP4 — expect it to take a while on anything long.

The third option, for completeness

An MP4 container can also carry a muxed text subtitle track inside the file itself — one file, but the subtitles are still real text that can be switched off. In principle this is the best of both worlds: lossless, fast, and no loose sidecar to lose.

In practice, player support for MP4 text tracks is uneven and most social platforms ignore them, which is why it is not the mainstream answer. If you want it, ffmpeg -i in.mp4 -i subs.srt -c copy -c:s mov_text out.mp4 does it without re-encoding the video. Soft, muxed and hard subtitles compared goes through all three in detail.

Related