Was macht FFmpeg Video Editor?
Bearbeiten Sie Video, Audio und Bilder direkt vom Terminal aus mit ffmpeg und dem Hilfsskript fftools.py.
CLI-Tool
Alle Operationen erfolgen über das Hilfsskript. Finden Sie es relativ zu dem Ort, an dem Sie das Repository geklont haben, oder unter:
SCRIPT="~/.claude/skills/ffmpeg/scripts/fftools.py"
Die gesamte Ausgabe erfolgt im JSON-Format.
Befehlsreferenz
# INFO — Dateidetails abrufen (Dauer, Auflösung, Codecs, Größe)
python3 $SCRIPT info input.mp4
# CUT — Einen Ausschnitt extrahieren
python3 $SCRIPT cut input.mp4 output.mp4 --start 00:01:30 --end 00:02:45
python3 $SCRIPT cut input.mp4 output.mp4 --start 00:01:30 --duration 30
# MERGE — Mehrere Videos zusammenfügen
python3 $SCRIPT merge video1.mp4 video2.mp4 video3.mp4 -o merged.mp4
python3 $SCRIPT merge video1.mp4 video2.mp4 -o merged.mp4 --reencode # unterschiedliche Codecs
# EXTRACT AUDIO — Audiospur extrahieren
python3 $SCRIPT extract-audio input.mp4 output.mp3
python3 $SCRIPT extract-audio input.mp4 output.opus --bitrate 128k
# SUBTITLES — Untertitel in Video einbrennen
python3 $SCRIPT subtitles input.mp4 output.mp4 --srt subs.srt
# RESIZE — Auflösung ändern
python3 $SCRIPT resize input.mp4 output.mp4 --width 1280 --height 720
python3 $SCRIPT resize input.mp4 output.mp4 --width 1920 --height -1 # automatische Höhe
# GIF — Video in animiertes GIF (Zwei-Durchgang, hohe Qualität)
python3 $SCRIPT gif input.mp4 output.gif --fps 15 --width 480
python3 $SCRIPT gif input.mp4 output.gif --start 00:00:05 --duration 3
# THUMBNAIL — Einzelnes Einzelbild extrahieren
python3 $SCRIPT thumbnail input.mp4 thumb.jpg --time 00:00:30
# THUMBNAILS — N gleichmäßig verteilte Einzelbilder extrahieren
python3 $SCRIPT thumbnails input.mp4 --count 10 --output-dir ./thumbs/
# COMPRESS — Dateigröße reduzieren
python3 $SCRIPT compress input.mp4 output.mp4 --crf 28 --preset medium
python3 $SCRIPT compress input.mp4 small.mp4 --crf 32 --preset fast # aggressiv
# SPEED — Wiedergabegeschwindigkeit ändern
python3 $SCRIPT speed input.mp4 fast.mp4 --factor 2.0 # 2× schneller
python3 $SCRIPT speed input.mp4 slow.mp4 --factor 0.5 # halbe Geschwindigkeit (Zeitlupe)
# WATERMARK — Bild-Overlay hinzufügen
python3 $SCRIPT watermark input.mp4 output.mp4 --watermark logo.png --position bottom-right
# TEXT — Text-Overlay einbrennen
python3 $SCRIPT text input.mp4 output.mp4 --text "Kapitel 1" --position center --size 72 --border
python3 $SCRIPT text input.mp4 output.mp4 --text "Sale!" --position top-left --start 5 --end 15
# CONVERT — Format ändern
python3 $SCRIPT convert input.avi output.mp4
python3 $SCRIPT convert input.mp4 output.webm --video-codec libvpx-vp9
# FRAMES — Einzelbilder als Bilder extrahieren
python3 $SCRIPT frames input.mp4 --output-dir ./frames/
python3 $SCRIPT frames input.mp4 --output-dir ./frames/ --every 30 # jedes 30. Einzelbild
# AUDIO REPLACE — Audiospur austauschen
python3 $SCRIPT audio-replace input.mp4 output.mp4 --audio music.mp3
# VOLUME — Lautstärke anpassen
python3 $SCRIPT volume input.mp4 output.mp4 --level 2.0 # Lautstärke verdoppeln
python3 $SCRIPT volume input.mp4 output.mp4 --level 0.5 # Lautstärke halbieren
python3 $SCRIPT volume input.mp4 output.mp4 --level 10dB # um 10 dB verstärken
# FADE — Ein-/Ausblendeffekte hinzufügen
python3 $SCRIPT fade input.mp4 output.mp4 --fade-in 2 --fade-out 3
# STABILIZE — Verwackeltes Video stabilisieren (erfordert vidstab-Filter)
python3 $SCRIPT stabilize input.mp4 output.mp4 --shakiness 7 --smoothing 15
# TRANSCRIBE — Sprache-zu-Text MIT Sprecherkennung (offline; siehe Transkriptionsabschnitt)
python3 $SCRIPT transcribe meeting.mp4 # → meeting.json/.srt/.txt
python3 $SCRIPT transcribe meeting.mp4 --speakers 3 # Sprecheranzahl angeben
python3 $SCRIPT transcribe meeting.mp4 --no-diarize # Nur Transkript, keine Sprechererkennung
Transkription und Analyse – verstehen, was in einem Video gesagt wird
Verwenden Sie den Befehl transcribe, um eine Besprechungsaufzeichnung, ein Interview oder jedes andere Sprachvideo/audio in ein mit Sprecherkennung und Zeitstempeln versehenes Transkript umzuwandeln. Dies ist das Werkzeug für Fragen wie „Was wurde besprochen?“, „Wer hat was gesagt?“, „Fasse dieses Meeting zusammen“ oder „Finde, wo über X gesprochen wurde“.
Es läuft 100 % lokal und offline – das Audio verlässt niemals die Maschine, keine Cloud-API. Im Hintergrund arbeiten: WhisperX (large-v3) für die Transkription + Wort-Zeitstempel und sherpa-onnx für die Sprecherdiarisierung (tokenfrei, offene ONNX-Modelle).
Einmalige Einrichtung (benötigt einmal Netzwerk)
Führen Sie den Slash-Befehl /setup-transcribe aus, oder direkt:
bash ~/.claude/skills/ffmpeg/scripts/install-transcribe.sh
Standardmäßig holt dies ein vorgefertigtes Bundle aus dem GitHub-Release (schnell: keine Modell-Gating, kein Torch-Build) und installiert es vollständig offline; falls dies nicht verfügbar ist (Release fehlt oder Plattform, deren Wheels nicht passen), wird automatisch auf einen Build von Grund auf zurückgegriffen. Es wird eine isolierte Python 3.12-Venv (mit uv) und alle Modelle erstellt; danach benötigt transcribe kein Netzwerk mehr. Wenn der Befehl meldet, dass die Venv fehlt, führen Sie dies aus.
Erzwingen Sie einen bestimmten Modus, wenn Sie möchten:
bash install-transcribe.sh --release # nur das vorgefertigte Release-Bundle
bash install-transcribe.sh --build # nur ein Build von Grund auf (HF + PyPI)
HF_TOKEN=hf_xxx bash install-transcribe.sh --build # auch --diarizer pyannote aktivieren
Kein Internetzugang / kein HuggingFace-Zugriff? Erstellen Sie einmal auf einer verbundenen Maschine ein eigenständiges Bundle, hosten Sie es irgendwo und installieren Sie es ohne HF/PyPI-Zugriff:
# Auf einer Maschine, auf der install-transcribe.sh bereits ausgeführt wurde:
bash ~/.claude/skills/ffmpeg/scripts/make-bundle.sh ffmpeg-transcribe-bundle.tar.gz
Das Bundle packt den gesamten Code, die Modelle, Modell-Caches und Python-Wheels. Sollte es 2 GB überschreiten, wird es automatisch in <name>.part-aa, <name>.part-ab, … aufgeteilt (jeweils <2 GB), um Hosting-/Upload-Limits zu erfüllen. Dann auf der Zielmaschine (benötigt nur uv, ffmpeg und python3.12):
# Einzelnes Datei-Bundle:
bash install-transcribe.sh --bundle https://ihr.server/ffmpeg-transcribe-bundle.tar.gz
# Aufgeteiltes Bundle – übergeben Sie die Teile in der richtigen Reihenfolge (sie werden automatisch zusammengefügt):
bash install-transcribe.sh --bundle \
https://ihr.server/ffmpeg-transcribe-bundle.tar.gz.part-aa \
https://ihr.server/ffmpeg-transcribe-bundle.tar.gz.part-ab
(Zum manuellen Zusammenfügen stattdessen: cat ffmpeg-transcribe-bundle.tar.gz.part-* > ffmpeg-transcribe-bundle.tar.gz.)
Verwendung
# Vollständiges Transkript + Sprecherkennung (schreibt meeting.json, meeting.srt, meeting.txt)
python3 $SCRIPT transcribe meeting.mp4
# Optionen
python3 $SCRIPT transcribe interview.mp4 --speakers 2 # bekannte Sprecheranzahl → bessere Genauigkeit
python3 $SCRIPT transcribe call.m4a --language en # Sprache erzwingen (automatische Erkennung überspringen)
python3 $SCRIPT transcribe lecture.mp4 --format txt # nur .txt schreiben
python3 $SCRIPT transcribe long.mp4 --model medium # schneller, weniger genau
python3 $SCRIPT transcribe q4.mp4 --diarizer pyannote # Diarisierung höherer Qualität (benötigt HF-Token)
python3 $SCRIPT transcribe notes.mp4 --no-diarize # Nur Transkript, keine Sprechertrennung
python3 $SCRIPT transcribe raw.wav -o ./out/session # benutzerdefinierter Ausgabebasis-Pfad
Ausgabeformate
.txt– lesbar, gruppiert nach Sprecherwechseln. Lesen Sie dies, um den Inhalt zu verstehen:[00:03:12] SPEAKER_01: ....srt– Untertitel mit Sprecher-Tags, zum erneuten Einbrennen (Befehlsubtitles).json– vollständige strukturierte Daten: jedes Segment + jedes Wort mit Start-/Endzeit und Sprecher, für programmatische Analysen (Suche, Zeitachsen, Zitate mit Zeitstempeln)
Meeting-Analyse-Workflow
# 1. Transkribieren mit Sprechererkennung
python3 $SCRIPT transcribe meeting.mp4
# 2. Transkript lesen, um Inhalt zu analysieren
# (Verwenden Sie das Read-Tool für meeting.txt, oder parsen Sie meeting.json für Zeitstempel)
# 3. Von hier aus können Sie zusammenfassen, Aktionspunkte extrahieren, finden, wer was gesagt hat,
# oder zu einem bestimmten Moment springen: Kombinieren Sie einen JSON-Zeitstempel mit `cut`/`thumbnail`.
python3 $SCRIPT cut meeting.mp4 clip.mp4 --start 00:12:30 --end 00:14:00
Hinweise:
- Die Transkription läuft auf der CPU (CTranslate2 hat keinen GPU-Pfad auf Apple Silicon), daher beträgt large-v3 etwa das 1- bis 2-Fache der Echtzeit. Eine 1-stündige Besprechung benötigt ca. 30–60 Minuten Verarbeitungszeit – kann also problemlos im Hintergrund laufen. Verwenden Sie
--model mediumoderdistil-large-v3für Geschwindigkeit. - Die Angabe von
--speakers N(wenn die Anzahl bekannt ist) verbessert die Diarisierung merklich.
Standard-Workflow
Schritt 1 – Eingabe analysieren
Beginnen Sie immer mit dem Abrufen der Dateiinformationen:
python3 $SCRIPT info input.mp4
Dies gibt Ihnen Dauer, Auflösung, Codecs und Dateigröße. Nutzen Sie diese Informationen, um fundierte Entscheidungen über die Ausgabeeinstellungen zu treffen.
Schritt 2 – Operation durchführen
Verwenden Sie den entsprechenden Befehl. Für komplexe Bearbeitungen verketten Sie mehrere Operationen – verwenden Sie die Ausgabe einer Operation als Eingabe für die nächste.
Schritt 3 – Ergebnis überprüfen
Überprüfen Sie nach jeder Operation die Ausgabe, um sicherzustellen, dass sie funktioniert hat:
python3 $SCRIPT info output.mp4
Schritt 4 – Ergebnis anzeigen
Verwenden Sie das Read-Tool, um Bilder anzuzeigen (Thumbnails, Einzelbilder). Teilen Sie dem Benutzer bei Videos den Ausgabepfad und die Dateigröße mit.
Rohes ffmpeg – Für fortgeschrittene Operationen
Wenn das Hilfsskript Ihren Anwendungsfall nicht abdeckt, verwenden Sie ffmpeg direkt:
# Bild-im-Bild
ffmpeg -y -i main.mp4 -i overlay.mp4 \
-filter_complex "[1:v]scale=320:-1[pip];[0:v][pip]overlay=W-w-10:H-h-10" \
-c:v libx264 -c:a copy output.mp4
# Nebeneinander-Vergleich
ffmpeg -y -i left.mp4 -i right.mp4 \
-filter_complex "[0:v]pad=iw*2:ih[bg];[bg][1:v]overlay=W/2:0" \
-c:v libx264 output.mp4
# Gitter/Mosaik (2×2)
ffmpeg -y -i a.mp4 -i b.mp4 -i c.mp4 -i d.mp4 \
-filter_complex "[0:v]scale=640:360[v0];[1:v]scale=640:360[v1];
[2:v]scale=640:360[v2];[3:v]scale=640:360[v3];
[v0][v1]hstack[top];[v2][v3]hstack[bot];[top][bot]vstack" \
-c:v libx264 grid.mp4
# Video rückwärts abspielen
ffmpeg -y -i input.mp4 -vf reverse -af areverse reversed.mp4
# Bestimmten Audiokanal extrahieren
ffmpeg -y -i input.mp4 -af "pan=mono|c0=FL" left_channel.wav
# Rauschunterdrückung
ffmpeg -y -i input.mp4 -af "afftdn=nf=-25" denoised.mp4
# Farbkorrektur (Helligkeit, Kontrast, Sättigung)
ffmpeg -y -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2:saturation=1.3" corrected.mp4
# Chroma-Key (Green-Screen-Entfernung)
ffmpeg -y -i greenscreen.mp4 -i background.mp4 \
-filter_complex "[0:v]chromakey=0x00FF00:0.3:0.1[fg];[1:v][fg]overlay" \
-c:v libx264 composited.mp4
# Zeitraffer aus Bildsequenz
ffmpeg -y -framerate 30 -i frame_%04d.jpg -c:v libx264 -pix_fmt yuv420p timelapse.mp4
# Video aus Einzelbild + Audio
ffmpeg -y -loop 1 -i cover.jpg -i audio.mp3 -c:v libx264 -tune stillimage \
-c:a aac -shortest output.mp4
# Überblendung zwischen zwei Videos (1 Sekunde)
ffmpeg -y -i first.mp4 -i second.mp4 \
-filter_complex "xfade=transition=fade:duration=1:offset=FIRST_DURATION_MINUS_1" \
-c:v libx264 crossfade.mp4
CRF-Qualitätsleitfaden
| CRF | Qualität | Anwendungsfall |
|---|---|---|
| 18 | Visuell verlustfrei | Archivierung, professionelle Bearbeitung |
| 23 | Hohe Qualität | Standard-ffmpeg, gut für die meisten Anwendungen |
| 28 | Gute Qualität | Empfohlen zum Teilen, kleinere Dateien |
| 32 | Akzeptabel | Soziale Medien, aggressive Komprimierung |
| 38+ | Niedrige Qualität | Vorschauen, Thumbnails |
Niedrigerer CRF = größere Datei, bessere Qualität. Jede +6 halbiert ungefähr die Dateigröße.
Format-Schnellreferenz
| Container | Video-Codec | Audio-Codec | Anwendungsfall |
|---|---|---|---|
.mp4 | H.264 (libx264) | AAC | Universelle Kompatibilität |
.webm | VP9 (libvpx-vp9) | Opus | Web, kleinere Dateien |
.mkv | H.265 (libx265) | Opus | Maximale Komprimierung |
.mov | ProRes | PCM | Professionelle Bearbeitung |
.gif | — | — | Animationen, kein Audio |
Fehlerbehandlung
- „No such file“ – Überprüfen Sie den Eingabepfad, verwenden Sie absolute Pfade
- „Unknown encoder“ – Codec nicht kompiliert. Überprüfen Sie
ffmpeg -encoders - „Permission denied“ – Ausgabepfad nicht beschreibbar
- „Avi header too large“ – Beschädigte Eingabe, versuchen Sie
-fflags +genptsvor der Eingabe - Timeout – Video ist sehr lang. Erhöhen Sie das Timeout oder verwenden Sie
--preset ultrafast - Nicht genügend Speicher – Reduzieren Sie zuerst die Auflösung, dann verarbeiten