Image

Embed Soft Subtitles

Embed an .srt or .vtt subtitle track inside an MP4 as a soft, toggle-able caption stream.

Loading interactive tool…

About this tool

Embed Soft Subtitles adds your .srt or .vtt subtitle file as a separate, selectable subtitle stream inside an MP4 video using FFmpeg's mov_text codec. Unlike burned-in hardsubs, soft subtitles can be toggled on or off by the viewer in any modern player (QuickTime, VLC, iOS Video, Android, Plex, smart TVs). The video and audio streams are copied losslessly — only the subtitle stream is added. You can set the language code (3-letter ISO like 'eng', 'spa', 'fra'), give the track a human-readable title ('English', 'Español'), and optionally mark it as the default track that auto-displays. Everything runs in your browser via ffmpeg.wasm — your files never upload.

Why use it

  • 100% private — neither video nor subtitle ever leaves your device

  • Lossless video and audio stream-copy — zero quality reduction

  • Toggle-able captions that viewers can show or hide

  • Multi-language friendly — the track has language metadata for player UIs

  • Near-instant processing thanks to stream-copy

  • Works offline after the first ffmpeg.wasm cache

How to use

  1. Drop your MP4 or MOV video into the first upload area (mov_text needs MP4-family containers).
  2. Drop your .srt or .vtt subtitle file into the second upload area.
  3. Set the 3-letter ISO language code — eng, spa, fra, deu, jpn, etc.
  4. Set a human-readable track title — 'English', 'Español', etc.
  5. Tick 'Mark as default subtitle track' if you want it to auto-display.
  6. Click 'Embed Soft Subtitles' and wait briefly for ffmpeg.wasm to mux the stream.
  7. Download the MP4 and test in VLC or QuickTime — the subtitle track should be selectable.

When it helps

  • Distributing tutorials where viewers may want to disable captions
  • Single-language releases where viewers should be able to switch captions on or off
  • Plex / Jellyfin / Kodi media server libraries that surface soft subtitles natively
  • Apple TV, Roku, smart TVs that show subtitle track menus
  • Archive masters where keeping subtitles editable is more useful than burning them
  • Producing client deliverables with a clearly labelled, selectable caption track

Examples

Embed English subs in tutorial

Input

200 MB MP4 + 12 KB .srt, lang=eng, title='English', default

Expected result

~200.012 MB MP4 with selectable English subtitle track in VLC / QuickTime

Spanish captions for a promo

Input

80 MB MP4 + 6 KB .srt, lang=spa, title='Español', default off

Expected result

MP4 with one selectable Spanish subtitle track that stays hidden until the viewer turns it on

Plex media server library file

Input

400 MB movie MP4 + 25 KB .srt, lang=eng, title='English'

Expected result

Same-size MP4 with English captions toggle-able in Plex

Tips

  • Run it once per file with one subtitle track — on an MP4 that already has a subtitle stream, the language, title and default flag are applied to the first (existing) track and the new track is left untagged.
  • Use 3-letter ISO 639-2 codes ('eng', 'spa', 'fra') so player UIs label tracks correctly.
  • Untick 'Mark as default subtitle track' if you want captions to stay off until the viewer turns them on.
  • If a player ignores your soft subs, switch to Burn Subtitles for permanent hardsub rendering.
  • VLC is the most reliable player for verifying soft sub embedding worked correctly.
  • After the first run ffmpeg.wasm is cached so subsequent embeds start instantly even offline.

Frequently Asked Questions

Does my video leave my device?
No. The video, audio, and subtitle files all stay on your device — embedding runs 100% locally via ffmpeg.wasm with no upload to any server.
Why does it require Chrome / Edge?
ffmpeg.wasm needs SharedArrayBuffer for multi-threaded WebAssembly, gated behind COOP/COEP cross-origin isolation headers. Chrome, Edge, Brave, and Arc all support this.
What's the file size limit?
No server limit. Browser memory caps practical input around 500 MB. Soft-sub embedding is stream-copy, so it uses very little extra RAM beyond the file itself.
Soft vs. hard subtitles — which should I choose?
Soft subs are toggle-able and editable but get stripped by many social platforms. Hard subs are permanent and work everywhere but can't be turned off. Use hard subs for social uploads, soft subs for archives and media servers.
Why does it only work with MP4 / MOV?
The mov_text subtitle codec only fits inside MP4-family containers. For WebM with subtitles, convert to MP4 first via Video Resize & Converter.
Why don't browser <video> tags show the subtitles?
HTML5 native <video> ignores most embedded subtitle tracks — VLC, QuickTime, iOS, and Android all show them correctly. For browser playback, use a separate <track> element with the .vtt file or use hardsubs.
Can I embed multiple subtitle tracks?
One track per run. Running the tool again on its own output does add a second stream, but the language code, title and default flag are written to the first subtitle stream — so the original track gets relabelled and the new one is left untagged. For properly labelled multi-language files, use a desktop tool such as ffmpeg or MKVToolNix.
Why does the first run take longer?
ffmpeg.wasm (~30 MB) downloads on first use and is then cached, so subsequent embeds start instantly even offline.

Explore the category

Glossary

mov_text
MP4-native subtitle codec that stores plain-text captions inside the MP4 container as a selectable stream.
Softsubs
Subtitles stored as a separate text track inside the file — toggle-able by the viewer in supported players.
Hardsubs
Subtitles burned into video pixels — permanent and visible in every player; opposite of softsubs.
ISO 639-2
Three-letter language code standard (eng, spa, fra, deu, jpn) used in subtitle track metadata.
Disposition
FFmpeg flag (-disposition:s:0 default) that marks a stream as default for auto-selection.
ffmpeg.wasm
WebAssembly port of FFmpeg that runs locally in your browser tab.
SharedArrayBuffer
JS memory primitive needed for multi-threaded WebAssembly; gated by COOP/COEP.
A LITTLE HELP. A LOT DONE.
Good tools.
Great flow.

Your shortcut to the everyday. Create, convert, calculate,
and get back to what you love.

✓ Free to use✓ No sign-up✓ 500+ possibilities