FFmpeg für die Videoproduktion
FFmpeg ist das unverzichtbare Werkzeug für die Video-/Audioverarbeitung. Dieser Skill behandelt die gängigen Operationen für Remotion-Videoprojekte.
Kurzübersicht
GIF zu MP4 (Remotion-kompatibel)
ffmpeg -i input.gif -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" output.mp4
Warum diese Flags:
-movflags faststart– Verschiebt Metadaten an den Anfang für Web-Streaming-pix_fmt yuv420p– Stellt Kompatibilität mit den meisten Playern sicherscale=trunc(...)– Erzwingt gerade Abmessungen (von den meisten Codecs benötigt)
Videogröße ändern
# Auf 1920x1080 (Seitenverhältnis beibehalten, schwarze Balken hinzufügen)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2" output.mp4
# Auf 1920x1080 (zuschneiden, um auszufüllen)
ffmpeg -i input.mp4 -vf "scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080" output.mp4
# Auf Breite skalieren, Höhe automatisch
ffmpeg -i input.mp4 -vf "scale=1280:-2" output.mp4
Video komprimieren
# Gute Qualität, kleinere Datei (CRF 23 ist Standard, niedriger = bessere Qualität)
ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
# Starke Komprimierung für Webvorschau
ffmpeg -i input.mp4 -c:v libx264 -crf 28 -preset fast -c:a aac -b:a 96k output.mp4
# Ziel-Dateigröße (z.B. ~10MB für 60s Video = ~1,3 Mbit/s)
ffmpeg -i input.mp4 -c:v libx264 -b:v 1300k -c:a aac -b:a 128k output.mp4
Audio extrahieren
# In MP3 extrahieren
ffmpeg -i input.mp4 -vn -acodec libmp3lame -q:a 2 output.mp3
# In AAC extrahieren
ffmpeg -i input.mp4 -vn -acodec aac -b:a 192k output.m4a
# In WAV extrahieren (unkomprimiert)
ffmpeg -i input.mp4 -vn output.wav
Audioformate konvertieren
# M4A in MP3 (für ElevenLabs-Sprachproben)
ffmpeg -i input.m4a -codec:a libmp3lame -qscale:a 2 output.mp3
# WAV in MP3
ffmpeg -i input.wav -codec:a libmp3lame -b:a 192k output.mp3
# Lautstärke anpassen
ffmpeg -i input.mp3 -filter:a "volume=1.5" output.mp3
Video trimmen/schneiden
# Ab Zeitstempel für Dauer schneiden (empfohlen – zuverlässig)
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c:v libx264 -c:a aac output.mp4
# Von Zeitstempel bis Zeitstempel schneiden
ffmpeg -i input.mp4 -ss 00:00:30 -to 00:00:45 -c:v libx264 -c:a aac output.mp4
# Stream-Kopie (schneller, kann aber an Schnittpunkten Frames verlieren)
# Nur verwenden, wenn die Quelle häufige Keyframes hat
ffmpeg -i input.mp4 -ss 00:00:30 -t 00:00:15 -c copy output.mp4
Hinweis: Für das Trimmen wird eine Neukodierung empfohlen. Die Stream-Kopie (-c copy) kann Video stillschweigend verwerfen, wenn der Suchpunkt nicht mit einem Keyframe übereinstimmt.
Beschleunigen / Verlangsamen
# 2-fache Geschwindigkeit (Video und Audio)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" -map "[v]" -map "[a]" output.mp4
# 0,5-fache Geschwindigkeit (Zeitlupe)
ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" -map "[v]" -map "[a]" output.mp4
# Nur Video (kein Audio)
ffmpeg -i input.mp4 -filter:v "setpts=0.5*PTS" -an output.mp4
Videos zusammenfügen
# Dateiliste erstellen
echo "file 'clip1.mp4'" > list.txt
echo "file 'clip2.mp4'" >> list.txt
echo "file 'clip3.mp4'" >> list.txt
# Zusammenfügen (gleicher Codec/Auflösung)
ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4
# Zusammenfügen mit Neukodierung (unterschiedliche Quellen)
ffmpeg -f concat -safe 0 -i list.txt -c:v libx264 -c:a aac output.mp4
Ein-/Ausblenden hinzufügen
# Einblenden in den ersten 1 Sekunde, Ausblenden in der letzten 1 Sekunde (30fps Video)
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=9:d=1" -c:a copy output.mp4
# Audio Ein-/Ausblenden
ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=1,afade=t=out:st=9:d=1" -c:v copy output.mp4
Videoinfo abrufen
# Dauer, Auflösung, Codec-Informationen
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
# Vollständige Informationen
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
Remotion-spezifische Muster
Video-Geschwindigkeitsanpassung für Remotion
Wann FFmpeg vs. Remotion playbackRate verwenden:
| Szenario | FFmpeg verwenden | Remotion verwenden |
|---|---|---|
| Konstante Geschwindigkeit (1,5x, 2x) | Beides funktioniert | ✅ Einfacher |
| Extreme Geschwindigkeiten (>4x oder <0,25x) | ✅ Zuverlässiger | Kann Probleme geben |
| Variable Geschwindigkeit (im Laufe der Zeit beschleunigen) | ✅ Vorverarbeitung | Komplexer Workaround nötig |
| Perfekte Audio-Synchronisation erforderlich | ✅ Garantiert | Normalerweise in Ordnung |
| Demo muss auf Voiceover-Timing passen | ✅ Vorberechnung | Laufzeitanpassung |
Remotion-Einschränkung: playbackRate muss konstant sein. Dynamische Interpolation wie playbackRate={interpolate(frame, [0, 100], [1, 5])} funktioniert nicht korrekt, da Remotion Frames unabhängig voneinander auswertet.
# Demo beschleunigen, um in eine Szene zu passen (z.B. 60s Demo in 20s = 3x Geschwindigkeit)
ffmpeg -i demo-raw.mp4 \
-filter_complex "[0:v]setpts=0.333*PTS[v];[0:a]atempo=3.0[a]" \
-map "[v]" -map "[a]" \
public/demos/demo-fast.mp4
# Zeitlupe zur Hervorhebung (0,5x Geschwindigkeit)
ffmpeg -i action.mp4 \
-filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \
-map "[v]" -map "[a]" \
public/demos/action-slow.mp4
# Beschleunigen ohne Audio (üblich für Bildschirmaufnahmen)
ffmpeg -i demo.mp4 -filter:v "setpts=0.5*PTS" -an public/demos/demo-2x.mp4
# Zeitraffereffekt (10x Geschwindigkeit, Audio verwerfen)
ffmpeg -i long-demo.mp4 -filter:v "setpts=0.1*PTS" -an public/demos/timelapse.mp4
Geschwindigkeitsfaktor berechnen:
- Um X Sekunden Video in Y Sekunden einer Szene unterzubringen:
geschwindigkeit = X / Y - setpts-Multiplikator =
1 / geschwindigkeit(z.B. 3x Geschwindigkeit = setpts=0.333*PTS) - atempo-Wert =
geschwindigkeit(z.B. 3x Geschwindigkeit = atempo=3.0)
Extreme Geschwindigkeit (>2x Audio): atempo-Filter verketten (jeder auf 0,5-2,0 begrenzt):
# 4x Geschwindigkeit Audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0[a]"
# 8x Geschwindigkeit Audio
-filter_complex "[0:a]atempo=2.0,atempo=2.0,atempo=2.0[a]"
Demo-Aufnahme für Remotion vorbereiten
# Standard 1080p, 30fps, Remotion-bereit
ffmpeg -i raw-recording.mp4 \
-vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \
-c:v libx264 -crf 18 -preset slow \
-c:a aac -b:a 192k \
-movflags faststart \
public/demos/demo.mp4
Bildschirmaufnahme in Remotion-Asset
# Von iPhone/iPad-Aufnahme (normalerweise 60fps, variable Auflösung)
ffmpeg -i iphone-recording.mov \
-vf "scale=1920:-2,fps=30" \
-c:v libx264 -crf 20 \
-an \
public/demos/mobile-demo.mp4
GIFs stapelweise konvertieren
for f in assets/*.gif; do
ffmpeg -i "$f" -movflags faststart -pix_fmt yuv420p \
-vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" \
"public/demos/$(basename "$f" .gif).mp4"
done
Häufige Probleme
"Höhe nicht durch 2 teilbar"
Scale-Filter hinzufügen: -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2"
Video wird im Browser nicht abgespielt
Verwenden: -movflags faststart -pix_fmt yuv420p -c:v libx264
Audio nach Geschwindigkeitsänderung asynchron
Filter_complex mit atempo verwenden: -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]"
Datei zu groß
CRF erhöhen (23→28) oder Auflösung reduzieren
Qualitätsrichtlinien
| Anwendungsfall | CRF | Preset | Hinweise |
|---|---|---|---|
| Archiv/Master | 18 | slow | Beste Qualität, große Dateien |
| Produktion | 20-22 | medium | Gute Balance |
| Web/Vorschau | 23-25 | fast | Kleinere Dateien |
| Entwurf/Schnell | 28+ | veryfast | Schnelle Kodierung |
Plattformspezifische Ausgabeoptimierung
Nachdem Remotion Ihr Video gerendert hat (typischerweise in out/video.mp4), verwenden Sie FFmpeg, um es für jede Distributionsplattform zu optimieren.
Workflow-Integration
Remotion-Render (Master) FFmpeg-Optimierung Plattform-Upload
↓ ↓ ↓
out/video.mp4 ────────→ out/video-youtube.mp4 ───→ YouTube
────────→ out/video-twitter.mp4 ───→ Twitter/X
────────→ out/video-linkedin.mp4 ───→ LinkedIn
────────→ out/video-web.mp4 ───→ Website-Einbettung
YouTube (empfohlene Einstellungen)
YouTube kodiert alles neu, daher in hoher Qualität hochladen:
# Für YouTube optimiert (1080p)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset slow -crf 18 \
-profile:v high -level 4.0 \
-bf 2 -g 30 \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-youtube.mp4
# YouTube Shorts (vertikal 1080x1920)
ffmpeg -i out/video.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2" \
-c:v libx264 -crf 18 -c:a aac -b:a 192k \
out/video-shorts.mp4
Twitter/X
Twitter hat strenge Grenzen: max 140s, 512MB, 1920x1200:
# Für Twitter optimiert (Ziel unter 15MB für schnellen Upload)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 24 \
-profile:v main -level 3.1 \
-vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 128k -ar 44100 \
-movflags +faststart \
-fs 15M \
out/video-twitter.mp4
# Dateigröße und Dauer prüfen
ffprobe -v error -show_entries format=duration,size -of csv=p=0 out/video-twitter.mp4
LinkedIn bevorzugt MP4 mit AAC-Audio, max. 10 Minuten:
# Für LinkedIn optimiert
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 22 \
-profile:v main \
-vf "scale='min(1920,iw)':'min(1080,ih)':force_original_aspect_ratio=decrease" \
-c:a aac -b:a 192k -ar 48000 \
-movflags +faststart \
out/video-linkedin.mp4
Website/Einbettung (optimiert für schnelles Laden)
# Web-optimiertes MP4 (kleine Datei, progressives Laden)
ffmpeg -i out/video.mp4 \
-c:v libx264 -preset medium -crf 26 \
-profile:v baseline -level 3.0 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k \
-movflags +faststart \
out/video-web.mp4
# WebM-Alternative (bessere Komprimierung, breitere Browser-Unterstützung)
ffmpeg -i out/video.mp4 \
-c:v libvpx-vp9 -crf 30 -b:v 0 \
-vf "scale=1280:720" \
-c:a libopus -b:a 128k \
-deadline good \
out/video-web.webm
GIF (für Vorschauen/Miniaturansichten)
# Hochwertiges GIF (erste 5 Sekunden)
ffmpeg -i out/video.mp4 -t 5 \
-vf "fps=15,scale=480:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview.gif
# Kleinere Datei GIF
ffmpeg -i out/video.mp4 -t 3 \
-vf "fps=10,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" \
out/preview-small.gif
Plattformanforderungen – Kurzübersicht
| Plattform | Max. Auflösung | Max. Größe | Max. Dauer | Audio |
|---|---|---|---|---|
| YouTube | 8K | 256GB | 12 Stunden | AAC 48kHz |
| Twitter/X | 1920x1200 | 512MB | 140s | AAC 44.1kHz |
| 4096x2304 | 5GB | 10 min | AAC 48kHz | |
| Instagram Feed | 1080x1350 | 4GB | 60s | AAC 48kHz |
| Instagram Reels | 1080x1920 | 4GB | 90s | AAC 48kHz |
| TikTok | 1080x1920 | 287MB | 10 min | AAC |
Stapelexport für alle Plattformen
#!/bin/bash
# speichern als: export-all-platforms.sh
INPUT="out/video.mp4"
# YouTube (hohe Qualität)
ffmpeg -i "$INPUT" -c:v libx264 -preset slow -crf 18 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-youtube.mp4
# Twitter (komprimiert)
ffmpeg -i "$INPUT" -c:v libx264 -crf 24 \
-vf "scale='min(1280,iw)':'-2'" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-twitter.mp4
# LinkedIn
ffmpeg -i "$INPUT" -c:v libx264 -crf 22 \
-c:a aac -b:a 192k -movflags +faststart \
out/video-linkedin.mp4
# Web-Einbettung (klein)
ffmpeg -i "$INPUT" -c:v libx264 -crf 26 \
-vf "scale=1280:720" \
-c:a aac -b:a 128k -movflags +faststart \
out/video-web.mp4
echo "Exportiert:"
ls -lh out/video-*.mp4
Fehlerbehandlung
Häufige Fehler und deren Behebung bei der Videoverarbeitung:
# Prüfen, ob FFmpeg erfolgreich war
ffmpeg -i input.mp4 -c:v libx264 output.mp4 && echo "Erfolg" || echo "Fehlgeschlagen: Eingabedatei prüfen"
# Ausgabedatei auf Abspielbarkeit prüfen
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of csv=p=0 output.mp4
# Detaillierte Fehlerinformationen abrufen
ffmpeg -v error -i input.mp4 -f null - 2>&1 | head -20
Umgang mit häufigen Fehlern
| Fehler | Ursache | Behebung |
|---|---|---|
| "No such file" | Eingabepfad falsch | Pfad prüfen, Anführungszeichen für Leerzeichen verwenden |
| "Invalid data" | Beschädigte Eingabe | Quelle erneut herunterladen oder neu aufnehmen |
| "height not divisible by 2" | Ungerade Abmessungen | Scale-Filter mit trunc hinzufügen |
| "encoder not found" | Fehlender Codec | FFmpeg mit vollständigen Codecs installieren |
| Ausgabe 0 Bytes | Stiller Fehler | Vollständige FFmpeg-Ausgabe auf Fehler prüfen |
Feedback & Beiträge
Wenn in diesem Skill Informationen fehlen oder er verbessert werden könnte:
- Fehlt ein Befehl? Beschreiben Sie, was Sie benötigt haben
- Fehler gefunden? Teilen Sie mir mit, was falsch ist
- Möchten Sie beitragen? Ich kann Ihnen helfen:
- Diesen Skill mit Verbesserungen zu aktualisieren
- Einen PR auf github.com/digitalsamba/claude-code-video-toolkit zu erstellen
Sagen Sie einfach "Verbessere diesen Skill" und ich werde Sie durch die Aktualisierung von .claude/skills/ffmpeg/SKILL.md führen.