Subtitle shifter & converter
All tools

How to Add Subtitles to a Video

Most of the time you don't need to edit the video at all: put a correctly named subtitle file next to it, or load it from your player's menu. Here is how for each common setup.

By the Feeed team · · 4 min read

To add subtitles to a video, either keep them as a separate file that the player loads (give the subtitle file the same name as the video and put it in the same folder, or open it from the player's menu) or embed them permanently into the video file with a tool such as MKVToolNix or ffmpeg.

External ("sidecar") subtitle files are the most flexible option. You can fix their timing or text later without touching the video, switch languages, or turn them off. Embedding is useful when you need a single file to share or upload.

Name the file so players find it automatically

Most players and media servers look for a subtitle file with the same base name as the video, in the same folder:

  • Movie.mkv and Movie.srt: the basic pattern.
  • Movie.en.srt, Movie.es.srt: a language code before the extension labels each track.
  • Movie (2019).en.forced.srt: forced subtitles, which only cover foreign-language dialogue or signs, in the naming style used by Plex.
  • Movie (2019).en.sdh.srt: subtitles for the deaf and hard of hearing, with sound descriptions.

Use two-letter (en) or three-letter (eng) language codes. The base name must match exactly, including spaces, the year in parentheses, and on some systems capitalization.

Desktop players: VLC and mpv

VLC loads a matching subtitle file automatically. To load a different one, choose Subtitle → Add Subtitle File... while the video is playing, or drag the subtitle file onto the video window. Switch tracks under Subtitle → Sub Track, or press V to cycle through them.

mpv also loads files whose name matches the video exactly. To choose one yourself, start it with mpv --sub-file=Movie.en.srt Movie.mkv, or drag the subtitle file onto the playing window. Press j to cycle through subtitle tracks.

If the subtitles appear but are early or late, fix the timing with the sync tool. If letters show up as odd symbols, see how to fix garbled subtitle characters.

Media servers: Plex, Jellyfin, and Kodi

All three scan for subtitle files stored next to the video. Put the subtitle in the same folder with the same base name plus a language code, such as Movie (2019).en.srt, then refresh the item's metadata if it doesn't show up. Recent versions of Plex and Jellyfin also understand flags such as forced and sdh in the file name, and Kodi reads language codes and a forced flag; each app's naming documentation has the details.

SRT is the safest choice for media servers. ASS styling depends on the app and the playback device, and some servers convert or burn in subtitles on the fly when a device can't display them, which can cause stuttering on a slow server.

YouTube

In YouTube Studio, open Subtitles from the left menu, choose the video, and add or select a language. Next to Subtitles, click Add, then Upload file, and choose With timing. YouTube accepts several formats, including SRT, SBV, and VTT. Choosing Without timing is a different workflow: YouTube takes a plain transcript and lines it up with the audio itself. If your subtitles are in ASS, convert them to SRT first.

Web pages: the HTML5 track element

Browsers display subtitles through the <track> element, and they only read WebVTT. An SRT file will not work until you convert it to VTT.

<video controls src="movie.mp4">
  <track kind="subtitles" src="captions.vtt" srclang="en" label="English" default>
</video>

Three details trip people up:

  • MIME type: the server should send the file as text/vtt. Some browsers are strict about this and ignore tracks served with the wrong type.
  • Cross-origin files: if the VTT file lives on a different domain than the page, that server must send CORS headers (Access-Control-Allow-Origin), and the <video> element needs a crossorigin attribute.
  • Local testing: some browsers refuse to load tracks when you open the HTML file straight from your disk. Test through a local web server instead.

Embedding subtitles permanently

Soft subtitles are stored as a separate track inside the video file. Viewers can switch them on and off, and the video itself isn't re-encoded, so the job takes seconds.

  • MKV with MKVToolNix: drag the video and subtitle files into MKVToolNix GUI, set the subtitle track's language, and click Start multiplexing. On the command line: mkvmerge -o out.mkv in.mkv --language 0:en subs.srt. MKV can hold SRT, ASS, and VTT tracks with their styling intact.
  • MP4 with ffmpeg: ffmpeg -i in.mp4 -i subs.srt -c copy -c:s mov_text out.mp4. MP4 stores text subtitles in its own mov_text format, so ASS styling won't survive.

Hard subtitles are burned into the picture and can't be turned off. They are the only option for platforms or devices that ignore subtitle tracks entirely. With ffmpeg: ffmpeg -i in.mp4 -vf subtitles=subs.srt -c:a copy out.mp4. This re-encodes the whole video, which takes much longer and costs some quality, so keep the original file. Burning in an ASS file this way keeps its styling and positioning, as long as the fonts it uses are installed.

Smart TVs and USB drives

TVs are the pickiest playback devices. For the best chance of success:

  • Use exactly the same base name as the video, in the same folder.
  • Use SRT; many TVs ignore VTT and ASS files.
  • Save the file as UTF-8, and try adding a byte order mark if accented letters look wrong. The encoding fixer can do both.
  • If the TV still ignores the file, try removing the language code from the name.

Not sure which format a device or platform wants? The subtitle format comparison covers where each one works.

Convert SRT to VTT →