There are three ways to attach subtitles to a video and they are not interchangeable. A separate .srt file sitting next to the video is the most flexible and the least portable. Embedding the subtitles as a track inside the file keeps them toggleable and takes seconds. Burning them into the picture makes them permanent and is the only option that survives Instagram, TikTok and most social platforms.

Pick the wrong one and you either upload a video with no captions at all, or you permanently scorch text onto footage you later want to reuse.

This guide covers what each method does, when to use it, and the exact steps.

The three methods

Subtitle attachment methods compared
Method Speed Reversible Use it when
Separate file Instant Yes Watching locally, sending to an editor, uploading to YouTube
Embedded track Seconds Yes One file to share, viewer can toggle captions on and off
Burned in Minutes to hours No Instagram, TikTok, X, anywhere captions must be visible by default

Burning in is the only one that changes the picture, which is why it is slow and why it cannot be undone. The other two leave the video untouched.

How to add subtitles to a video

  1. Decide whether the subtitles need to be permanent, toggleable, or separate.
  2. For a separate file, put the .srt in the same folder with a matching filename.
  3. For an embedded track, mux the .srt into the container without re-encoding.
  4. For burned-in captions, re-encode the video with the subtitle filter applied.
  5. Play the result back and check the first and last subtitle against the audio.

Method 1: A separate .srt file

The simplest option, and it requires no software at all. Put the subtitle file in the same folder as the video and give it the same name:

interview.mp4
interview.srt

VLC, MPV, IINA and most desktop players load it automatically on playback. If it does not appear, most players have a Subtitle menu with an "Add subtitle file" option.

This is also what YouTube wants. Do not burn captions into a video you are uploading to YouTube. Upload the video, then in YouTube Studio open Subtitles, choose Upload File, and select "With timing". YouTube then serves the captions as a toggleable track, which viewers can turn off, and which YouTube reads for search.

The limitation is portability. Send someone the video without the .srt and they get nothing. Upload it anywhere and the subtitles stay behind.

Method 2: Embedding the subtitles as a track

This puts the subtitles inside the video file as a separate stream. One file to share, and the viewer can still toggle captions on and off. Crucially, it does not re-encode the video, so it takes seconds regardless of file size and loses no quality.

With ffmpeg, into an MP4:

ffmpeg -i video.mp4 -i subs.srt -c copy -c:s mov_text output.mp4

Into an MKV, which handles SRT natively:

ffmpeg -i video.mp4 -i subs.srt -c copy output.mkv

The -c copy is what makes this fast: it tells ffmpeg to copy the existing video and audio streams untouched rather than re-encoding them. MP4 needs -c:s mov_text because the MP4 container does not accept raw SRT and needs it converted to its own subtitle format.

If you would rather not use the command line, HandBrake has a Subtitles tab where you can add an .srt and choose whether to burn it in or embed it as a track. MKVToolNix does the same for MKV files.

One caveat: support for embedded subtitle tracks varies. Desktop players handle them well. Some smart TVs, older phones and web players ignore them entirely.

Method 3: Burning subtitles into the picture

Burned-in captions, sometimes called hardcoded or open captions, are drawn into the video frames themselves. They cannot be turned off, cannot be restyled, and cannot be removed without re-editing from the original.

You need this for Instagram, TikTok, X and most social platforms, because they do not read subtitle tracks from uploaded files. If the captions are not in the picture, they do not exist.

With ffmpeg:

ffmpeg -i video.mp4 -vf subtitles=subs.srt output.mp4

With basic styling:

ffmpeg -i video.mp4 -vf "subtitles=subs.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,BorderStyle=3'" output.mp4

This one re-encodes, so it is slow. Expect minutes for a short clip and considerably longer for anything lengthy or high resolution. It also costs a generation of quality, since the video is being compressed again.

Because it is irreversible, always burn from a copy. Keep the original video and the .srt file separately so you can redo it if the wording or styling turns out wrong.

Video editors handle this too. Premiere Pro, DaVinci Resolve and CapCut all import .srt files and let you style captions on a timeline before exporting, which is easier than getting ffmpeg styling right by trial and error.

Which platforms need which

  • YouTube: upload the .srt separately in YouTube Studio. Do not burn in. Burned-in captions cannot be turned off and are not read for search.
  • Instagram, TikTok, X: burn in. These platforms have their own auto-caption features, but an uploaded .srt is not read from the file.
  • LinkedIn: accepts an .srt upload alongside the video, so burning in is optional.
  • Vimeo: accepts .srt upload as a toggleable track.
  • A website with an HTML5 player: use a separate file with the track element. Convert the SRT to VTT first, since browsers require WebVTT rather than SRT.
  • Sending to a client or editor: send both files separately. Never send burned-in footage to someone who may need to change the wording.

Things that go wrong

  • Subtitles appear late or early by a constant amount. An offset problem. Most players have a subtitle delay control, and Subtitle Edit can shift every timecode at once.
  • They drift further out as the video plays. The subtitle file was made from a different cut or a different framerate. Shifting will not fix this. Regenerate from the actual video.
  • Accented or non-Latin characters show as boxes or question marks. An encoding problem. Save the .srt as UTF-8 without a BOM. When burning in, make sure the chosen font actually contains the characters.
  • Lines run off the edge of the screen. Around 42 characters per line and no more than two lines at once is the usual convention. Translated text is often longer than the original, which is where this most often bites.
  • Nothing happens after muxing into MP4. Usually a missing -c:s mov_text. MP4 will not carry raw SRT.
  • Burned-in text is unreadable over bright footage. Use an outline or a background box rather than plain white text. The BorderStyle=3 option in the styling example draws a box behind the text.

Getting the subtitle file in the first place

All of the above assumes you already have an .srt. If you do not, generate one from the video's audio rather than typing it.

OmniveraLabs' SRT generator takes a video or audio file, or a YouTube link, and returns a timed .srt file. Our guides cover generating an SRT from audio and converting an existing script or LRC file into SRT.


Need the subtitle file first? OmniveraLabs' free SRT generator turns a video or audio file into a timed .srt, ready to embed or burn in.

Frequently asked questions

How do I add an SRT file to an MP4?

Either keep the .srt in the same folder with a matching filename so players load it automatically, or embed it into the file with ffmpeg using: ffmpeg -i video.mp4 -i subs.srt -c copy -c:s mov_text output.mp4. The second option produces a single file with a toggleable subtitle track and takes seconds because it does not re-encode.

What is the difference between soft and hardcoded subtitles?

Soft subtitles are stored as data, either as a separate file or as a track inside the video, and can be turned off. Hardcoded or burned-in subtitles are drawn into the video frames and are permanent. Soft is preferable wherever it is supported; hardcoded is necessary on platforms that do not read subtitle tracks.

Do I need to burn subtitles in for YouTube?

No, and you should not. Upload the video, then add the .srt separately in YouTube Studio under Subtitles using Upload File with timing. Burned-in captions cannot be switched off by viewers and are not readable by YouTube for search.

Why do Instagram and TikTok need burned-in captions?

Because they do not read subtitle tracks from an uploaded video file. If the captions are not part of the picture, they will not appear. Both platforms offer their own auto-caption tools, but those are generated on the platform rather than taken from your file.

Does embedding subtitles reduce video quality?

No, as long as you copy the streams rather than re-encoding. The -c copy flag leaves the video and audio untouched and simply adds a subtitle stream. Burning subtitles in is different: it re-encodes the video and does cost a generation of quality.

How do I convert an SRT to VTT for a website?

Browsers require WebVTT rather than SRT for the HTML5 track element. Subtitle Edit converts between the two, and the formats are close: VTT uses a period before the milliseconds where SRT uses a comma, and adds a WEBVTT header line.

Can I remove burned-in subtitles from a video?

Not cleanly. The text is part of the image, so removing it means either re-exporting from the original footage or attempting to paint it out frame by frame. Always keep the original video and the .srt file separately before burning in.

My subtitles are out of sync. How do I fix them?

If they are consistently early or late by the same amount, shift every timecode by that offset using a subtitle editor or your player's subtitle delay control. If they drift progressively further out, the file was made from a different cut or framerate and shifting will not help. Regenerate it from the actual video.

← Back to the blog