All Tools View Categories About Contact Privacy

Subtitle Burn-in Tool

Generate an ffmpeg command to hardcode subtitles.

Runs entirely in your browser — no data is uploaded or stored.

Hardcoded captions cannot be turned off — use soft muxing if you want toggleable subs.

About this tool & how to use it
  • Real ffmpeg syntax: The command is built with correct quoting around every path, so filenames containing spaces or brackets survive the copy-paste into your shell. You get a line you can run as-is rather than a template to edit.
  • Styling through force_style: The force_style string (optional) box is passed verbatim into the subtitles filter, letting you set FontName, FontSize, PrimaryColour, OutlineColour, BorderStyle and Alignment. Leave it empty and libass falls back to its default look.
  • Explicit output naming: The Output file field controls the container and filename of the encode, so you can write to .mp4 for social platforms or .mkv for archive masters without editing the command afterwards.
  • Sensible defaults: If you leave a field blank the generator substitutes video.mp4, subs.srt and output.mp4, which makes it easy to preview the shape of the command before you supply your real paths.
  • Copy or download: The generated command can be copied to the clipboard in one click or downloaded as a .txt file, which is handy when you are assembling a batch script for a whole season of episodes.
  • Works with any libass-readable subtitle: Because the filter is ffmpeg's own, the same command shape handles SRT and ASS/SSA source files, with ASS keeping its own embedded styling.
  • Nothing leaves the machine: The tool only manipulates strings. Your media never touches a server, which matters for embargoed cuts and client-confidential footage.
  1. Type the path to your source video into the Video file box, for example episode01.mp4 or a full path such as /media/masters/episode01.mp4.
  2. Enter your caption file in the Subtitle file box, typically the SRT you exported from your editing or translation tool.
  3. Set the Output file box to the filename you want ffmpeg to create, and make sure it differs from the input so nothing is overwritten.
  4. If you want a specific look, fill in force_style string (optional) with libass keys such as FontName=Arial,FontSize=28,PrimaryColour=&H00FFFFFF,Outline=2; skip it for the default styling.
  5. Press Run to generate the command, then read it once to confirm the paths and the style fragment are quoted exactly as you expect.
  6. Copy the command or download it as a .txt file, paste it into a terminal on a machine with ffmpeg installed, and let the encode finish.
  7. Play the resulting file and scrub to a few captioned moments to check font size and position before you publish or deliver.

Example 1 - a plain burn-in for social. A finished cut plus an English SRT, output as an MP4 that autoplays muted in a feed.

Video file:    promo.mp4
Subtitle file: promo-en.srt
Output file:   promo-captioned.mp4

ffmpeg -i "promo.mp4" -vf "subtitles=promo-en.srt" "promo-captioned.mp4"

Example 2 - branded styling. A style string keeps the same structure but pushes your font and outline into libass.

force_style: FontName=Montserrat,FontSize=30,Outline=3

ffmpeg -i "promo.mp4" -vf "subtitles=promo-en.srt:force_style='FontName=Montserrat,FontSize=30,Outline=3'" "promo-captioned.mp4"

One appended filter argument is the difference between a caption that reads on a phone in daylight and one lost against a bright sky.

About Subtitle Burn-in Tool

The Subtitle Burn-in Tool turns four plain-text inputs into one ready-to-run ffmpeg command that paints your captions permanently into the video picture. Fill in Video file, Subtitle file and Output file, optionally add a force_style string (optional), and you get a command line to copy or download as .txt.

Hardcoded captions exist because many delivery targets ignore soft subtitle tracks. Instagram, TikTok and X play video with no caption selector at all, and ad networks, in-store screens and conference reels behave the same way. Social teams, e-learning producers and localisation vendors all hit the same wall: a perfect translated SRT that no viewer will ever see unless it is baked into the frames.

Technically the tool assembles ffmpeg's subtitles video filter. -i takes the source, -vf "subtitles=yourfile.srt" renders each cue through libass, and the final quoted argument is the output path. A style string is appended inside the same filter as :force_style='...', which is where libass keys such as FontName, FontSize, PrimaryColour and Alignment belong. Because a video filter is involved ffmpeg re-encodes the picture, so expect real processing time rather than an instant remux.

This is a command generator, not an encoder: no media is read or uploaded, and ffmpeg must be installed locally to run the result.

Features

  • Real ffmpeg syntax: The command is built with correct quoting around every path, so filenames containing spaces or brackets survive the copy-paste into your shell. You get a line you can run as-is rather than a template to edit.
  • Styling through force_style: The force_style string (optional) box is passed verbatim into the subtitles filter, letting you set FontName, FontSize, PrimaryColour, OutlineColour, BorderStyle and Alignment. Leave it empty and libass falls back to its default look.
  • Explicit output naming: The Output file field controls the container and filename of the encode, so you can write to .mp4 for social platforms or .mkv for archive masters without editing the command afterwards.
  • Sensible defaults: If you leave a field blank the generator substitutes video.mp4, subs.srt and output.mp4, which makes it easy to preview the shape of the command before you supply your real paths.
  • Copy or download: The generated command can be copied to the clipboard in one click or downloaded as a .txt file, which is handy when you are assembling a batch script for a whole season of episodes.
  • Works with any libass-readable subtitle: Because the filter is ffmpeg's own, the same command shape handles SRT and ASS/SSA source files, with ASS keeping its own embedded styling.
  • Nothing leaves the machine: The tool only manipulates strings. Your media never touches a server, which matters for embargoed cuts and client-confidential footage.

How to Use

  1. Type the path to your source video into the Video file box, for example episode01.mp4 or a full path such as /media/masters/episode01.mp4.
  2. Enter your caption file in the Subtitle file box, typically the SRT you exported from your editing or translation tool.
  3. Set the Output file box to the filename you want ffmpeg to create, and make sure it differs from the input so nothing is overwritten.
  4. If you want a specific look, fill in force_style string (optional) with libass keys such as FontName=Arial,FontSize=28,PrimaryColour=&H00FFFFFF,Outline=2; skip it for the default styling.
  5. Press Run to generate the command, then read it once to confirm the paths and the style fragment are quoted exactly as you expect.
  6. Copy the command or download it as a .txt file, paste it into a terminal on a machine with ffmpeg installed, and let the encode finish.
  7. Play the resulting file and scrub to a few captioned moments to check font size and position before you publish or deliver.

Examples

Example 1 - a plain burn-in for social. A finished cut plus an English SRT, output as an MP4 that autoplays muted in a feed.

Video file:    promo.mp4
Subtitle file: promo-en.srt
Output file:   promo-captioned.mp4

ffmpeg -i "promo.mp4" -vf "subtitles=promo-en.srt" "promo-captioned.mp4"

Example 2 - branded styling. A style string keeps the same structure but pushes your font and outline into libass.

force_style: FontName=Montserrat,FontSize=30,Outline=3

ffmpeg -i "promo.mp4" -vf "subtitles=promo-en.srt:force_style='FontName=Montserrat,FontSize=30,Outline=3'" "promo-captioned.mp4"

One appended filter argument is the difference between a caption that reads on a phone in daylight and one lost against a bright sky.

Benefits

  • Captions that always show up: Burned-in text plays everywhere, including platforms with no subtitle selector, so your translated or accessibility copy is never silently dropped by a player.
  • No syntax hunting: The subtitles filter has fiddly quoting rules that are easy to get wrong at 2am; letting the generator handle them saves you a round of failed encodes and cryptic ffmpeg errors.
  • Predictable brand look: Because force_style is applied at encode time, every deliverable in a campaign uses the same font, size and outline rather than whatever the viewer's device decides.
  • Confidential footage stays put: Since only text is processed in your browser, unreleased cuts and client material never travel to a third-party server.
  • Easy to scale up: A copied command is trivially turned into a loop or a batch file, so a one-off burn-in becomes a repeatable step in your delivery pipeline.
  • A clear choice between hard and soft: Knowing exactly what the command does makes it obvious when burning in is right and when a toggleable muxed track would serve viewers better.

Frequently Asked Questions

What does burn-in mean?
The subtitle becomes part of the video pixels (hardcoded), so it shows on any player but cannot be turned off.
Do you run ffmpeg for me?
No. This generates the command; you run it in your terminal with ffmpeg installed.
Can I style the captions?
Yes, provide a force_style string like FontName=Arial,FontSize=24,PrimaryColour=&HFFFFFF&.
Is my file uploaded?
No, the command is built locally in your browser.