Add Subtitles to Video

Burn an SRT or VTT subtitle file into your video, right in your browser. Free and private hardcoded captions, with no upload and no watermark.

🌐 Español

Drop your files here (.mp4, .mov, .m4v, .webm, .srt, .vtt)

🔒 Private by design: your files are processed locally in your browser and never uploaded to any server.

Burning captions is a one-way decision

There are two ways a video can carry subtitles. A soft track sits beside the picture as its own stream, and a player draws it on demand: you can switch it off, restyle it, or swap languages. A burned-in caption is part of the picture, painted into every frame during encoding, exactly like a broadcast chyron.

Burning wins on survival and loses on flexibility, and there is no middle ground. Once a caption is in the pixels, it is in every copy anyone ever makes of that file, on every player, in feeds that autoplay muted, and in re-shares that would have stripped a separate track. It also cannot be turned off by a viewer who does not want it, cannot be corrected without going back to the source video, and will be baked at whatever size and position you chose today.

That is the trade this page makes for you. It is the right trade for a clip going into a social feed or to a client who should not have to find a settings menu, and the wrong one for a film you might subtitle in a second language later. Keep the source video and the subtitle file, always: they are what you would need to redo the burn differently.

Two style values reach the renderer, and no more

The captions are drawn by the subtitle renderer built into FFmpeg, and this page forces exactly two style values into it: the font size you set, and an alignment code derived from Subtitle position (a bottom-centre code for Bottom, a top-centre code for Top). Everything else is whatever the renderer’s own defaults are.

That means no font picker, no colour picker, no outline or shadow control, no per-line styling and no karaoke or animation effects. If your .srt contains inline styling tags, do not count on them being honoured. It is a deliberate limit rather than a missing feature list: two controls that reliably do what they say beats a dozen that half work through a filter graph.

Position is more useful than it looks. Bottom is the default because that is where viewers look for captions, but if your footage already has a lower third, a logo bug or a platform’s own UI overlay eating the bottom of the frame, moving the text to the top is the difference between readable and buried.

Feeding the page a video and its subtitle file

  1. Drop the video and the subtitle file onto the box above together, or use Choose files and add them one after the other. MP4, MOV, M4V and WEBM are accepted on the video side, .srt and .vtt on the subtitle side, and the two are told apart by extension so order does not matter.
  2. Choose Subtitle position, Bottom or Top.
  3. Set Font size, anywhere from 12 to 48.
  4. Press Add Subtitles to Video and keep the tab open. Every frame is being redrawn and re-encoded, so this is not instant and it scales with the length of your clip.
  5. Download the result, which arrives as an MP4 with -subtitled added to the video’s own name.

When the burn finishes but the result is wrong

Three failures account for most of them, and none produces an error message, because from the encoder’s point of view nothing went wrong.

Captions that never appear usually mean the timestamps do not overlap the clip. Captions that appear but are unreadable are almost always a size problem rather than a rendering one, and one short test clip settles it faster than guessing. Garbled accented characters come from a subtitle file that was not saved as UTF-8, which is decoded before FFmpeg sees it and cannot be recovered afterwards.

The one thing you cannot fix after the fact is timing drift. If the captions run steadily ahead of or behind the speech, fix the subtitle file first with Shift Subtitle Timing, which moves every timestamp earlier or later and can also stretch them to correct a framerate mismatch, then burn the corrected file. Re-burning a video whose captions are already baked in is not a repair.

Getting the subtitle file itself in shape first

If the captions you want are already inside an MKV or MP4 as a soft track, you do not need to retype them: Extract Subtitles from Video lists the embedded tracks and saves the ones you pick as SRT or VTT, which is exactly what this page then takes. If you are starting from nothing, the subtitle editor lets you write cues against real playback and export them. And if a tool downstream of you insists on one format when you have the other, Convert SRT to VTT moves a file between the two, although you will not need it just for this page, which accepts both.

The whole burn runs through a WebAssembly build of FFmpeg inside your own browser tab, so an unreleased edit or a client’s footage is never uploaded to be processed. That also means the encode uses your device’s own hardware, which is why a long recording takes real time rather than finishing the moment you click.

Frequently asked questions

My accented characters came out as garbage in the burned captions. How do I fix that?

The subtitle file is read as text with the browser's UTF-8 decoder before it reaches FFmpeg. A .srt saved in a legacy single-byte codepage, which some older subtitle editors still default to, decodes incorrectly at that moment, and the wrong characters are then drawn permanently into the frames. Open the subtitle file in a plain text editor, save it as UTF-8, and run the burn again with that copy.

Does my video's original audio survive the burn?

The file is probed first. If an audio stream is found it is re-encoded to AAC at 128 kbps alongside the picture; if the source has no audio at all, the encode runs with audio disabled rather than trying to map a track that is not there. Either way the audio is never stream-copied on this page, because burning captions is a full re-encode regardless.

Can I burn two subtitle files at once, one at the top and one at the bottom?

Not in a single run, which expects exactly one video and exactly one subtitle file. Two passes work, though. Burn the first file, download the MP4, drop that MP4 back into the box with your second subtitle file and the other position setting, and run it again. Be aware that the second pass re-encodes an already-encoded video, so there is a little more generation loss than a single pass would cost.

What does the font size number mean, and why does 24 look different on two videos?

It is handed straight to the subtitle renderer as its font size style value, and this page clamps it to the 12 to 48 range, falling back to 24 for anything outside that. How large it ends up looking is decided when the renderer scales the subtitle script onto your particular frame. There is no preview here, so burning a short test clip first is far cheaper than re-running a long video twice to find the right number.

The video finished but no captions ever appear. What went wrong?

The most common cause is a subtitle file whose timestamps do not overlap the footage, for example an .srt exported against a longer cut, or one whose times begin an hour in. Nothing checks that any cue actually lands inside the clip's duration; whatever is scheduled gets rendered, and if nothing is scheduled during your clip then nothing is drawn. Open the subtitle file in a text editor and compare its first timestamp with where your video starts.

Can I write the captions here, rather than bringing a finished file?

No. This page needs a completed .srt or .vtt as its second input and has no text entry of its own. Writing cues against playback is a separate job, and the subtitle editor on this site is built for exactly that, exporting .srt or .vtt files that you then bring back here to burn in.

Related tools