Untertitel ins Video einfügen mit FFmpeg
Praxisanleitung für Untertitel mit FFmpeg — SRT/ASS einbrennen, Untertitelspuren einbetten, Styling, Mehrsprachigkeit und Untertitel extrahieren.

Untertitel machen Videos zugänglich, durchsuchbar und auch in lauten Umgebungen schaubar. FFmpeg kann Untertitel direkt ins Video einbrennen, sie als wählbare Spuren einbetten, vorhandene Untertitel extrahieren und zwischen Untertitelformaten konvertieren. Diese Anleitung deckt alles ab — mit Befehlen, die du sofort nutzen kannst.
Hardcode oder Softcode — was nehmen?
Bevor du Untertitel hinzufügst, musst du dich entscheiden:
| Methode | Beschreibung | Vorteile | Nachteile |
|---|---|---|---|
| Hardcode (eingebrannt) | Untertitel werden in die Videopixel gerendert | Immer sichtbar, läuft überall | Nicht abschaltbar, Re-Encoding nötig |
| Softcode (eingebettet) | Untertitel als separate Spur gespeichert | Umschaltbar, mehrere Sprachen | Player muss es unterstützen |
Faustregel: Hardcode für Social Media und maximale Kompatibilität. Softcode für Langform-Content und Mehrsprachigkeit. Wenn du eine UGC-Plattform mit User-Uploads baust, ist Softcode meist die bessere Wahl.
Wie brennst du SRT-Untertitel ein?
SRT ist das gängigste Untertitelformat. So brennst du es ins Video ein:
# Hardcode SRT subtitles
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" output.mp4
Das war's. FFmpeg nutzt den subtitles-Filter (powered by libass), um die SRT-Datei direkt auf jedes Frame zu rendern.
Wie passt du das SRT-Aussehen an?
Das Standard-Rendering ist schmucklos. Mit force_style kannst du es stylen:
# Custom font, size, and color
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Arial,FontSize=24,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Shadow=1'" output.mp4
Übliche Style-Parameter:
| Parameter | Beispiel | Beschreibung |
|---|---|---|
| FontName | Arial | Schriftart |
| FontSize | 24 | Größe in Punkten |
| PrimaryColour | &H00FFFFFF | Textfarbe (ABGR Hex) |
| OutlineColour | &H00000000 | Konturfarbe |
| BackColour | &H80000000 | Schatten/Hintergrundfarbe |
| Outline | 2 | Konturstärke |
| Shadow | 1 | Schattentiefe |
| Bold | 1 | Fett (0 oder 1) |
| Alignment | 2 | Position (2=unten zentriert) |
| MarginV | 30 | Vertikaler Rand |
Achtung: Farben sind im ABGR-Format (Alpha, Blue, Green, Red), nicht das übliche RGB.
# Yellow text with black outline, larger font, positioned higher
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=28,PrimaryColour=&H0000FFFF,OutlineColour=&H00000000,Outline=3,MarginV=40'" output.mp4
Sonderzeichen in Pfaden
Hat dein Untertitel-Pfad Sonderzeichen, escape sie:
# Escape colons in Windows paths or special characters
ffmpeg -i input.mp4 -vf "subtitles='my\ subtitles.srt'" output.mp4
# Or use the subtitle file index approach
ffmpeg -i input.mp4 -i subs.srt -filter_complex "[0:v][1:s]overlay" output.mp4
Wie brennst du gestylte ASS/SSA-Untertitel ein?
ASS (Advanced SubStation Alpha) unterstützt reiches Styling — Schriften, Farben, Animationen und Position pro Zeile. Beim Einbrennen bleibt das gesamte Styling erhalten:
# Hardcode ASS subtitles (all styling preserved)
ffmpeg -i input.mp4 -vf "ass=subs.ass" output.mp4
Eine einfache ASS-Datei bauen
Hier ein Beispiel für eine ASS-Struktur:
[Script Info]
Title: My Subtitles
ScriptType: v4.00+
PlayResX: 1920
PlayResY: 1080
[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Arial,48,&H00FFFFFF,&H000000FF,&H00000000,&H80000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,40,1
[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:01.00,0:00:04.00,Default,,0,0,0,,Hello, this is a subtitle.
Dialogue: 0,0:00:05.00,0:00:08.00,Default,,0,0,0,,This line has {\b1}bold{\b0} text.
SRT zu ASS mit eigenem Styling konvertieren
# Convert SRT to ASS (then you can edit the ASS styles)
ffmpeg -i subs.srt subs.ass
Nach der Konvertierung den Abschnitt [V4+ Styles] in der ASS-Datei anpassen. Eventuell willst du dein Video auch in ein anderes Format konvertieren, je nach Zielplattform.
Wie bettest du Untertitelspuren ein? (Softcode)
Softcoded-Untertitel werden als eigener Stream im Container gespeichert. Der Zuschauer kann sie ein- und ausschalten.
SRT als Untertitelspur einbetten
# Add SRT subtitle track to MP4
ffmpeg -i input.mp4 -i subs.srt -c copy -c:s mov_text output.mp4
# Add SRT subtitle track to MKV (MKV supports SRT natively)
ffmpeg -i input.mp4 -i subs.srt -c copy -c:s srt output.mkv
Wichtig: MP4-Container brauchen den mov_text-Codec für Untertitel. MKV unterstützt SRT, ASS und viele weitere Formate nativ.
Mehrere Untertitelsprachen einbetten
# Add English and Spanish subtitle tracks to MKV
ffmpeg -i input.mp4 -i english.srt -i spanish.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c copy -c:s srt \
-metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:s:1 language=spa -metadata:s:s:1 title="Spanish" \
output.mkv
Für MP4:
# Add multiple subtitle tracks to MP4
ffmpeg -i input.mp4 -i english.srt -i chinese.srt \
-map 0:v -map 0:a -map 1 -map 2 \
-c copy -c:s mov_text \
-metadata:s:s:0 language=eng -metadata:s:s:0 title="English" \
-metadata:s:s:1 language=chi -metadata:s:s:1 title="Chinese" \
output.mp4
Default-Untertitelspur setzen
# Mark the first subtitle track as default
ffmpeg -i input.mp4 -i subs.srt \
-map 0 -map 1 \
-c copy -c:s mov_text \
-disposition:s:0 default \
output.mp4
ASS-Untertitel als Soft-Track einbetten
# Add ASS to MKV (preserves all styling for compatible players)
ffmpeg -i input.mp4 -i subs.ass -map 0 -map 1 -c copy -c:s ass output.mkv
Wie ziehst du Untertitel aus einem Video raus?
Nach SRT extrahieren
# Extract the first subtitle track to SRT
ffmpeg -i input.mkv -map 0:s:0 output.srt
# Extract the second subtitle track
ffmpeg -i input.mkv -map 0:s:1 output.srt
Nach ASS extrahieren
# Extract subtitle track as ASS (preserves styling)
ffmpeg -i input.mkv -map 0:s:0 output.ass
Verfügbare Untertitelspuren auflisten
# Show all streams including subtitles
ffprobe -v error -show_entries stream=index,codec_name,codec_type -of csv input.mkv
# More detailed subtitle info
ffprobe -v error -select_streams s -show_entries stream=index,codec_name:stream_tags=language,title -of json input.mkv
Alle Untertitelspuren extrahieren
#!/bin/bash
# Extract all subtitle tracks from a video
INPUT="input.mkv"
# Count subtitle streams
COUNT=$(ffprobe -v error -select_streams s -show_entries stream=index -of csv=p=0 "$INPUT" | wc -l)
for i in $(seq 0 $((COUNT - 1))); do
# Get language tag
LANG=$(ffprobe -v error -select_streams s:$i -show_entries stream_tags=language -of csv=p=0 "$INPUT")
LANG=${LANG:-"track$i"}
ffmpeg -i "$INPUT" -map 0:s:$i "${INPUT%.*}_${LANG}.srt"
done
Wie konvertierst du zwischen Untertitelformaten?
FFmpeg konvertiert zwischen Untertitelformaten:
# SRT to ASS
ffmpeg -i subs.srt subs.ass
# ASS to SRT (loses styling)
ffmpeg -i subs.ass subs.srt
# SRT to WebVTT
ffmpeg -i subs.srt subs.vtt
# SUB/IDX (DVD) to SRT (requires OCR — FFmpeg can't do this directly)
# Use a tool like SubtitleEdit or Tesseract for bitmap-to-text conversion
| Von | Nach | Styling erhalten? |
|---|---|---|
| SRT → ASS | Ja | Default-Styling wird ergänzt |
| ASS → SRT | Nein | Styling geht verloren |
| SRT → VTT | Teilweise | Basis-Formatierung bleibt |
| VTT → SRT | Teilweise | VTT-Spezifisches geht verloren |
Wie passt du das Untertitel-Timing an?
Untertitel verzögern oder vorziehen
# Delay subtitles by 2.5 seconds
ffmpeg -i input.mp4 -itsoffset 2.5 -i subs.srt -map 0 -map 1 -c copy -c:s mov_text output.mp4
Bei eingebrannten Untertiteln nimm den setpts-Filter oder pass die SRT direkt an (wenn du Videoteile schneiden oder zusammenfügen musst, wird das Timing besonders wichtig):
# Shift hardcoded subtitles (using subtitle filter with offset)
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" -ss 00:00:02.500 output.mp4
Wie passt du Untertitel an die Auflösung an?
Beim Einbrennen hängt die Render-Qualität der Untertitel von der Videoauflösung ab. Für beste Ergebnisse die Originalauflösung beibehalten:
# Hardcode subtitles while keeping original resolution
ffmpeg -i input.mp4 -vf "subtitles=subs.srt" -c:v libx264 -crf 23 -c:a copy output.mp4
# Hardcode and scale to 1080p
ffmpeg -i input.mp4 -vf "subtitles=subs.srt,scale=-2:1080" -c:v libx264 -crf 23 -c:a copy output.mp4
Schriftgröße für verschiedene Auflösungen
# For 720p video — smaller font
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=20'" -c:v libx264 -crf 23 output.mp4
# For 4K video — larger font
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=48,Outline=3'" -c:v libx264 -crf 23 output.mp4
Wie verarbeitest du viele Videos auf einmal?
Untertitel für alle Videos einbrennen
# Assumes each video has a matching .srt file
for f in *.mp4; do
srt="${f%.mp4}.srt"
if [ -f "$srt" ]; then
ffmpeg -i "$f" -vf "subtitles=$srt" -c:v libx264 -crf 23 -c:a copy "subtitled_${f}"
fi
done
Untertitel als Spuren für alle Videos einbetten
# Add matching SRT files as subtitle tracks
for f in *.mp4; do
srt="${f%.mp4}.srt"
if [ -f "$srt" ]; then
ffmpeg -i "$f" -i "$srt" -c copy -c:s mov_text "soft_${f}"
fi
done
Was tun bei typischen Problemen?
„No such filter: subtitles" — FFmpeg wurde ohne libass-Support kompiliert. Ein vollständiges Build installieren:
# macOS
brew install ffmpeg
# Ubuntu/Debian
sudo apt install ffmpeg libass-dev
Untertitel erscheinen nicht — Das Encoding der Untertitel-Datei prüfen. FFmpeg erwartet UTF-8:
# Convert subtitle encoding to UTF-8
iconv -f ISO-8859-1 -t UTF-8 subs_latin.srt > subs_utf8.srt
Falsche Position oder Größe — Die Videoauflösung passt nicht zur angenommenen Auflösung der Untertitel. Mit force_style überschreiben:
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=24,MarginV=30'" output.mp4
Sonderzeichen erscheinen als Kästchen — Die Schriftart unterstützt die Zeichen nicht. Eine passende Schrift angeben:
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Noto Sans CJK SC'" output.mp4
MP4-Output scheitert mit „unknown codec" für Untertitel — MP4 unterstützt nur mov_text. Für andere Untertitelformate MKV nehmen oder einbrennen.
Cloud-Variante mit FFHub
Untertitel einbrennen heißt Re-Encoding und das ist CPU-hungrig — ein 1-Stunden-Video kann auf einer Standard-Maschine 20+ Minuten dauern. FFHub lässt FFmpeg per API in der Cloud laufen, du lagerst das Einbrennen auf schnelle Cloud-Server aus, deine Maschine bleibt frei.
Besonders nützlich, wenn du mehrere Untertitelversionen (verschiedene Sprachen, Stile) aus demselben Quellvideo brauchst.
Zusammenfassung
- Hardcode (
-vf "subtitles=subs.srt") für garantierte Sichtbarkeit auf allen Plattformen - Softcode (
-c:s mov_textfür MP4,-c:s srtfür MKV) für umschaltbare Spuren force_stylenutzen, um SRT-Untertitel zu stylen- ASS-Format nutzen, wenn du reiches Styling und Animationen brauchst
- Mit
-mapmehrere Untertitelsprachen ergänzen - Mit
ffprobevorhandene Untertitelspuren vor der Extraktion prüfen - Untertitel-Dateien immer als UTF-8 speichern
Verwandte Artikel
- How to Trim and Merge Videos with FFmpeg - Clips schneiden, splitten und verketten und dabei das Untertitel-Timing in Sync halten
- How to Convert Video Format with FFmpeg - Zwischen MP4-, MKV- und WebM-Containern wechseln, jeder geht anders mit Untertiteln um
- How to Extract Audio from Video with FFmpeg - Audiospuren aus dem Video ziehen für Transkription und Untertitel-Generierung