Communitygithub.com

aelyraAI/ffmpeg

Video- und Audioverarbeitung mit FFmpeg. Nutzbar für Formatkonvertierung, Größenänderung, Komprimierung, Audioextraktion und Vorbereitung von Assets für Remotion.

Was ist ffmpeg?

Diese Fähigkeit (Skill) bietet einen umfassenden, praxisorientierten Leitfaden für die Nutzung von FFmpeg in der Videoproduktion, mit besonderem Fokus auf Remotion-Projekte. Sie enthält gebrauchsfertige Befehle für gängige Aufgaben wie GIF-zu-MP4-Konvertierung, Videogrößenänderung, Komprimierung, Audioextraktion, Trimmen, Beschleunigen/Verlangsamen und Zusammenfügen von Clips. Darüber hinaus werden Remotion-spezifische Muster behandelt, etwa die Entscheidung zwischen FFmpeg und der Remotion-`playbackRate` für Geschwindigkeitsanpassungen sowie die optimale Vorbereitung von Demo-Aufnahmen. Ein weiterer Schwerpunkt liegt auf der plattformspezifischen Ausgabeoptimierung für YouTube, Twitter/X, LinkedIn und Web-Einbettungen, inklusive einer Batch-Export-Funktion. Die Dokumentation umfasst auch Qualitätsrichtlinien (CRF-Werte), Fehlerbehandlung und gängige Problembehebungen, was sie zu einer wertvollen Ressource für Entwickler macht, die Medien-Workflows in KI-Agenten-Umgebungen automatisieren möchten.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aelyraAI/aelyra-skills/tree/HEAD/ffmpeg

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

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 sicher
  • scale=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:

SzenarioFFmpeg verwendenRemotion verwenden
Konstante Geschwindigkeit (1,5x, 2x)Beides funktioniert✅ Einfacher
Extreme Geschwindigkeiten (>4x oder <0,25x)✅ ZuverlässigerKann Probleme geben
Variable Geschwindigkeit (im Laufe der Zeit beschleunigen)✅ VorverarbeitungKomplexer Workaround nötig
Perfekte Audio-Synchronisation erforderlich✅ GarantiertNormalerweise in Ordnung
Demo muss auf Voiceover-Timing passen✅ VorberechnungLaufzeitanpassung

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

AnwendungsfallCRFPresetHinweise
Archiv/Master18slowBeste Qualität, große Dateien
Produktion20-22mediumGute Balance
Web/Vorschau23-25fastKleinere Dateien
Entwurf/Schnell28+veryfastSchnelle 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

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

PlattformMax. AuflösungMax. GrößeMax. DauerAudio
YouTube8K256GB12 StundenAAC 48kHz
Twitter/X1920x1200512MB140sAAC 44.1kHz
LinkedIn4096x23045GB10 minAAC 48kHz
Instagram Feed1080x13504GB60sAAC 48kHz
Instagram Reels1080x19204GB90sAAC 48kHz
TikTok1080x1920287MB10 minAAC

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

FehlerUrsacheBehebung
"No such file"Eingabepfad falschPfad prüfen, Anführungszeichen für Leerzeichen verwenden
"Invalid data"Beschädigte EingabeQuelle erneut herunterladen oder neu aufnehmen
"height not divisible by 2"Ungerade AbmessungenScale-Filter mit trunc hinzufügen
"encoder not found"Fehlender CodecFFmpeg mit vollständigen Codecs installieren
Ausgabe 0 BytesStiller FehlerVollstä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:
    1. Diesen Skill mit Verbesserungen zu aktualisieren
    2. 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.

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

Verwandte Skills