Was macht Video-Komposition – Montage, Audio, Kodierung & Validierung?
FFmpeg ist die Auslieferungsschicht, kein Designtool. Es sollte bereits gestaltete Szenen erhalten und daraus einen sauberen Master sowie plattformspezifische Kodierungen produzieren.
Lies references/FFMPEG-COOKBOOK.md für kopierfertige Befehle und scripts/validate.sh für einen Prüfung vor der Auslieferung.
Regel null: zuerst auslesen. Ein Filtergraph, der auf angenommene Stream-Eigenschaften aufbaut, ist die häufigste Ursache für defekte Ausgaben.
ffprobe -v error -show_streams -show_format -of json input.mp4
1. Vor dem Kombinieren normalisieren
Inkompatible Eingaben verursachen Ruckeln, Stille, Drift und Halos. Vor jeder Zusammenführung mehrerer Quellen müssen alle Eingaben in folgenden Eigenschaften übereinstimmen:
| Eigenschaft | Ziel |
|---|---|
| Auflösung | Projekt-Master (z.B. 1920×1080) |
| Pixel-Seitenverhältnis | 1:1 |
| Bildrate | Projekt-FPS, konstant |
| Zeitbasis | konsistent |
| Pixelformat | yuv420p für Auslieferung, yuva444p10le/PNG für Alpha |
| Farbraum / Transfer | ein Standard; markieren |
| Audio | 48 kHz, Stereo, konsistenter Codec |
ffmpeg -i in.mp4 -vf "scale=1920:1080:flags=lanczos,fps=30,setsar=1" \
-c:v libx264 -crf 14 -preset fast -pix_fmt yuv420p \
-c:a aac -ar 48000 -ac 2 -b:a 256k normalized.mp4
Zwischenschritte in hoher Qualität halten (CRF 12–16 oder ProRes). Kodiere die Auslieferungsversion erst einmalig.
2. Konkatenation
Gleicher Codec, Größe, fps, Pixelformat und Audio-Layout → Stream-Kopie, schnell und verlustfrei:
printf "file 'shot_01.mp4'\nfile 'shot_02.mp4'\n" > list.txt
ffmpeg -f concat -safe 0 -i list.txt -c copy final.mp4
Alles andere → Filtergraph:
ffmpeg -i a.mp4 -i b.mp4 -filter_complex \
"[0:v]scale=1920:1080,fps=30,setsar=1[v0]; \
[1:v]scale=1920:1080,fps=30,setsar=1[v1]; \
[v0][0:a][v1][1:a]concat=n=2:v=1:a=1[v][a]" \
-map "[v]" -map "[a]" -c:v libx264 -crf 16 -pix_fmt yuv420p -c:a aac final.mp4
Stream-Kopie von nicht übereinstimmenden Eingaben niemals verwenden. Es „gelingt“ und produziert defekte Wiedergabe.
3. Overlay, Alpha und Bild-in-Bild
# transparentes Element über Hintergrund
ffmpeg -i bg.mp4 -i logo.mov -filter_complex \
"[0:v][1:v]overlay=W-w-48:48:format=auto" -c:v libx264 -crf 16 out.mp4
# Bild-in-Bild, skalierte und abgerundete Quelle
ffmpeg -i main.mp4 -i insert.mp4 -filter_complex \
"[1:v]scale=640:-2[pip];[0:v][pip]overlay=W-w-40:H-h-40" out.mp4
Alpha-Regeln:
- H.264/MP4 kann kein Alpha tragen. Verwende PNG-Sequenz, ProRes 4444 oder WebM/VP9 mit Alpha.
- Alpha nach jedem Schritt über einem kontrastreichen Hintergrund prüfen.
- Achte auf Halos durch prämultiplikatives vs. direktes Alpha an dunklen Kanten; Folge der Konvention des Quell-Renderers.
4. Audio
# Musikbett mit Ein-/Ausblende und Ducking unter Sprache
ffmpeg -i video.mp4 -i music.mp3 -i voice.wav -filter_complex \
"[1:a]volume=0.35,afade=t=in:st=0:d=1,afade=t=out:st=28:d=2[bed]; \
[2:a]volume=1.0[vo]; \
[bed][vo]sidechaincompress=threshold=0.08:ratio=6:attack=8:release=250[duck]; \
[duck][vo]amix=inputs=2:duration=first:dropout_transition=0[a]" \
-map 0:v -map "[a]" -c:v copy -c:a aac -b:a 192k out.mp4
# Lautstärke messen, dann normalisieren
ffmpeg -i in.mp4 -af loudnorm=I=-14:TP=-1:LRA=11:print_format=json -f null -
ffmpeg -i in.mp4 -af loudnorm=I=-14:TP=-1:LRA=11 -c:v copy out.mp4
Zielwerte variieren je nach Plattform (-14 LUFS für viele Web-Plattformen, -23/-24 für Rundfunk). Messen, dann wählen. Vermeide Normalisieren einer Datei, die bereits auf Zielniveau ist.
5. Untertitel
# einbrennen (harte Untertitel)
ffmpeg -i in.mp4 -vf "subtitles=captions.srt:force_style='FontName=Inter,FontSize=22,PrimaryColour=&H00FFFFFF,OutlineColour=&H80000000,BorderStyle=3,Outline=1,Shadow=0'" \
-c:v libx264 -crf 18 -c:a copy out.mp4
# weiche Untertitel (verschiebbare Spur)
ffmpeg -i in.mp4 -i captions.srt -c copy -c:s mov_text -metadata:s:s:0 language=eng out.mp4
RTL prüfen: force_style mit einer formatauglichen Schriftart, korrekter Alignment und ein kontrolliertes gerendertes Bild. Halte Untertitel innerhalb der sicheren Bereiche und oberhalb der Plattform-UI.
6. Plattformkodierung
# landscape YouTube, 1080p30
ffmpeg -i master.mov -c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p \
-profile:v high -level 4.1 -movflags +faststart \
-c:a aac -b:a 192k -ar 48000 out_1080p.mp4
# vertical social, 1080x1920
ffmpeg -i master.mov -vf "scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920" \
-c:v libx264 -preset slow -crf 18 -pix_fmt yuv420p -movflags +faststart \
-c:a aac -b:a 192k out_vertical.mp4
# hochwertiges Zwischenformat für weitere Compositing-Schritte
ffmpeg -i master.mov -c:v prores_ks -profile:v 3 -pix_fmt yuv422p10le -c:a pcm_s24le master.mov
Prüfe, ob der Encoder existiert: ffmpeg -encoders | grep -E "libx264|prores|nvenc". Hardware-Encoder sind schnell, aber oft geringere Qualität pro Bit; vor dem Versand vergleichen.
7. Einzelbilder, Kontaktbogen, GIF
# Standbild zu Zeitpunkten
ffmpeg -ss 00:00:03.5 -i in.mp4 -frames:v 1 frame.png
# Kontaktbogen
ffmpeg -i in.mp4 -vf "fps=1,scale=320:-1,tile=4x4" -frames:v 1 sheet.jpg
# hochwertiges GIF (palettegen/paletteuse)
ffmpeg -i in.mp4 -vf "fps=15,scale=640:-1:flags=lanczos,palettegen" palette.png
ffmpeg -i in.mp4 -i palette.png -lavfi "fps=15,scale=640:-1:flags=lanczos[x];[x][1:v]paletteuse" out.gif
8. Validierung (nicht überspringen)
ffprobe -v error \
-show_entries format=duration,size,bit_rate,format_name \
-show_entries stream=index,codec_type,codec_name,width,height,r_frame_rate,avg_frame_rate,pix_fmt,channels,sample_rate,nb_frames \
-of json final.mp4
Automatisierte Prüfungen:
# schwarze Segmente (versehentliche schwarze Frames)
ffmpeg -i final.mp4 -vf "blackdetect=d=0.1:pix_th=0.05" -an -f null - 2>&1 | grep blackdetect || true
# eingefrorene Segmente (zu lange statische Sequenz)
ffmpeg -i final.mp4 -vf "freezedetect=n=0.003:d=2" -an -f null - 2>&1 | grep freeze || true
# Audiopräsenz und Spitzenpegel
ffmpeg -i final.mp4 -af volumedetect -f null - 2>&1 | grep -E "mean_volume|max_volume"
Dann ersten Frame, letzten Frame, jeden Übergang und textreiche Frames prüfen. Zahlen belegen, dass die Datei wohlgeformt ist; sie belegen nicht, dass sie richtig aussieht.
9. Framegenauigkeits-Fallen
- VFR-Quellen (Bildschirmaufnahmen, Handyvideos) driften gegenüber einer CFR-Zeitlinie. Mit
fps=30normalisieren und Dauer prüfen. - Off-by-one: N Frames bei 30 fps entsprechen genau N/30 Sekunden; ein 300-Frame-Render dauert 10,0 s. Wenn die Dauer 9,97 s beträgt, wurde ein Frame verworfen.
- Abgeschnittenes Audio kürzer als Video → Stille am Ende; gezielt auffüllen oder kürzen.
- Gedrehtes Handyvideo trägt eine Dispay-Matrix;
-noautorotatenur verwenden, wenn wirklich gewünscht. - Farbverschiebung nach Kodierung: Tags
color_primaries/transferprüfen; eine Browser-Vorschau ist keine zuverlässige Farbreferenz. - Wiederholte Kodierung senkt die Qualität; einen hochwertigen Master behalten und davon kodieren.
10. Lieferpaket
output/
final_1080p.mp4 # primär
final_vertical.mp4 # Plattform-Variante, falls gewünscht
final_master.mov # ProRes/H.264 CRF 14, für zukünftige Kodierungen aufbewahren
thumbnail.png # 1280x720 oder 1080x1920
contact-sheet.jpg
captions.srt
project-report.md # Tool-Versionen, Einstellungen, durchgeführte Prüfungen
Exakte Eigenschaften aus ffprobe angeben; niemals raten.