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.mkvandMovie.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 acrossoriginattribute. - 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.