All Tools

Subtitle Burn-In Tool

Hard-embed captions into the video itself. Drop a video and a subtitle file, sync the timing, pick the style, and burn — all locally in your browser. Outputs MP4 (H.264 / AAC).

  • In your browser
  • Files never uploaded
  • Free

Frequently asked questions

What is "burning in" subtitles?
Hard-embedding (a.k.a. burning in) means the subtitle text becomes part of the actual video pixels — the captions are drawn onto every frame and saved into the encoded output. There is no separate track to enable or disable. This is what you want when uploading to platforms that don't honor sidecar subtitle files, or when delivering a finished video where viewers shouldn't have to toggle anything.
Does my video get uploaded to a server?
No. The video is mounted into FFmpeg's in-browser virtual filesystem via WORKERFS — FFmpeg reads it lazily from your local file handle without copying it into JS memory. Subtitle parsing and the actual encode happen entirely in the browser. Nothing leaves the page.
How long does the burn-in take?
Depends on hardware and source resolution, but typically faster than realtime. The FFmpeg WASM build uses libx264 (the same encoder behind most professional encodes) at the `veryfast` preset, which keeps quality high while pushing throughput; libass renders the captions into each frame in lockstep with the video filter chain. A 10-minute 1080p source usually finishes in 4–8 minutes. The progress panel shows elapsed time and an ETA estimate so you can see exactly where things stand.
What output format do I get?
MP4 with H.264 video and AAC audio — universally playable on iOS, Android, every desktop video player, and every social platform. Output uses `+faststart` so the file streams immediately when uploaded to a web server.
Which subtitle formats can I drop in?
SRT, VTT, ASS, SSA, SMI, TTML, DFXP, SBV, LRC, MicroDVD, and SubViewer. Whatever format you give us is parsed into a normalized cue list and re-emitted as ASS for the libass renderer; the per-track style controls (font size, color, outline, position) override anything declared in the original file.
My subtitles are slightly off-time. Can I fix that here?
Yes. The sync controls let you offset every cue forward or backward (slider plus quick ±0.1s / ±1s buttons) and rescale the timing for framerate conversion (e.g. NTSC ↔ PAL). The preview updates live so you can dial it in before burning.
Can I burn multiple subtitle tracks at once?
Yes — drop as many as you want. Each track gets its own row with enable / position (top, mid-top, mid-bottom, bottom) / color / outline color / font-size controls. The burn pipeline chains a libass filter per enabled track; the four position zones split the vertical space so a four-track stack lays out cleanly without overlap.
Are RTL scripts and CJK supported?
Yes. libass uses libfribidi for bidirectional text shaping (Arabic, Hebrew, Persian, Urdu) and libfreetype for glyph rendering across CJK and emoji. Whatever your browser can display, libass can render onto the video — no extra setup needed.
Can libass render ASS karaoke effects?
Yes — libass is the canonical ASS / SSA renderer used by VLC, mpv, and most fansub workflows. ASS karaoke timing tags, transforms, and complex styling all render correctly in the burned output. Drop an ASS file directly to preserve the original styling, or override per-track with the style controls in the UI.