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
- Drop your MP4 or MOV video into the first upload area (mov_text needs MP4-family containers).
- Drop your .srt or .vtt subtitle file into the second upload area.
- Set the 3-letter ISO language code — eng, spa, fra, deu, jpn, etc.
- Set a human-readable track title — 'English', 'Español', etc.
- Tick 'Mark as default subtitle track' if you want it to auto-display.
- Click 'Embed Soft Subtitles' and wait briefly for ffmpeg.wasm to mux the stream.
- 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
01Embed English subs in tutorial
Input200 MB MP4 + 12 KB .srt, lang=eng, title='English', default
Expected result~200.012 MB MP4 with selectable English subtitle track in VLC / QuickTime
02Spanish captions for a promo
Input80 MB MP4 + 6 KB .srt, lang=spa, title='Español', default off
Expected resultMP4 with one selectable Spanish subtitle track that stays hidden until the viewer turns it on
03Plex media server library file
Input400 MB movie MP4 + 25 KB .srt, lang=eng, title='English'
Expected resultSame-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.
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