FFmpeg Cookbook

Subtitle Burn-in Tool

Burn SRT/VTT subtitles into a video (hard subs). Adjust font, size, position, and outline color.

Local processing — no upload
🎬
Video file
MP4 / MOV / WebM
📝
Subtitle file (SRT / VTT)
.srt / .vtt
— or paste SRT directly —
The bundled font reliably supports Latin characters. CJK and other non-Latin scripts may not render correctly without a custom font.
Processing… 0%
Popular uses
Burn in SRT subtitlesSocial posts for muted viewingAdd explanatory captions

What this tool does

  • Accepts SRT and VTT subtitle files
  • Paste-text mode for quick custom captions without a file
  • Adjustable font size, color, outline color/width, and position
  • Bold style toggle for high-contrast viewing
  • Hardcoded subtitles — guaranteed to display anywhere the video plays

How to use

  1. 1

    Pick a video

    MP4 / MOV / WebM, etc.

  2. 2

    Provide the subtitles

    Upload an .srt / .vtt file, or paste timecoded text directly.

  3. 3

    Set the style

    Tune size, color, outline, position. Match font size to your output resolution.

  4. 4

    Burn the subtitles

    Download once processing completes.

What each setting means

Font size
In pixels. 36–48 px for 1080p, 24–32 px for 720p reads cleanly.
Text color
Subtitle body color. White and yellow are conventional.
Outline color / width
Stroke around the text. Black + 2–3 px is standard for legibility.
Position
Top, center, or bottom. Bottom is conventional for dialogue.
Bold
Bumps weight for high-motion or busy backgrounds.

Recommended settings

YouTube explainer (1080p)
Font 40 px · white · black outline 3 px · bottom
Standard YouTube-style subtitles.
TikTok / Shorts (vertical)
Font 56 px · yellow · black outline 4 px · centered
Larger, bolder text reads on smaller screens.
Interview / dialogue
Font 32 px · white · outline 2 px · bottom · bold off
Subtle styling keeps focus on the speaker.

Common pitfalls

Symptom: Subtitles show garbled characters

Cause: SRT encoded in Shift_JIS or UTF-16.

Fix: Resave as UTF-8 (no BOM) in your editor.

Symptom: Subtitles never appear

Cause: Timecode format is wrong (SRT uses commas, VTT uses dots).

Fix: Match the format to the file extension.

Symptom: Non-Latin text shows as boxes (tofu)

Cause: Bundled font is Noto Sans Bold — Latin only.

Fix: Use desktop FFmpeg with a CJK font for non-Latin subtitles.

Symptom: Timing drifts late in the video

Cause: Subtitles run past video length, or VFR source.

Fix: Trim subtitle end times and convert source to CFR if needed.

Equivalent FFmpeg commands

Reference commands you can run on the desktop FFmpeg CLI.

Burn an SRT (basic)
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" out.mp4
Burn an SRT with style overrides
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Noto Sans,FontSize=40,PrimaryColour=&Hffffff&,OutlineColour=&H000000&,Outline=2,Bold=1,Alignment=2'" out.mp4
Alignment=2 → bottom center; colors are ASS-format BGR.
Burn a VTT file
ffmpeg -i input.mp4 -vf "subtitles=subs.vtt" out.mp4

Browser support & limits

  • Recommended max: 500 MB
  • Bundled font: Noto Sans Bold (Latin only)
  • Hard subs only — for soft subs use desktop FFmpeg

Privacy

This tool runs ffmpeg.wasm directly in your browser. Files never leave your device — everything runs locally. Read the privacy policy →

Frequently asked questions

Hard subs vs. soft subs?

Hard = baked into the video (cannot be turned off). Soft = separate track (toggleable). This tool produces hard subs only.

Should I burn subs for YouTube?

YouTube prefers soft subs (CC). Hard subs make sense mostly for TikTok / Instagram-style platforms that don’t honor SRT.

Why is non-Latin text not rendered?

Bundling CJK fonts would balloon the WASM payload, so we ship Latin only. Use desktop FFmpeg with a CJK font for those scripts.

SRT vs VTT?

SRT is the most common. VTT is the HTML5 standard and supports inline styling. Both are accepted here.

Can I use a custom font?

Not in the browser version. Run desktop FFmpeg with libass for full font control.

Will the tool fix my timecodes?

No — timecodes are passed through as-is. Use Subtitle Edit (or similar) to clean up timing first.

Speaker colors / styles?

Basic SRT supports <b>/<i> markup. For per-speaker color, write a VTT file with class tags like <c.speaker1>.

Related tools

Related FFmpeg recipes