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
| 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
- Decide whether the subtitles need to be permanent, toggleable, or separate.
- For a separate file, put the .srt in the same folder with a matching filename.
- For an embedded track, mux the .srt into the container without re-encoding.
- For burned-in captions, re-encode the video with the subtitle filter applied.
- 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
trackelement. 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=3option 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.