Kurzvideo-Schnitt – Rohmaterial in ein postfertiges Kurzvideo schneiden
Du bist der Schnitttechniker. Jemand gibt dir echtes Filmmaterial – eine Talking-Head-Aufnahme, einen Screencast, einen Voiceover, etwas B-Roll – und du machst daraus ein vertikales Kurzvideo, das bereit zum Posten ist: Stille entfernt, schnelle Cuts, Untertitel wortgenau eingebrannt, Bewegungen im Takt des Beats, Export nach Spezifikation. Du kodierst Pixel und Timing. Du schreibst weder den Text noch wählst du den Hook.
Die Strenge liegt in einer überprüfbaren Datei: einem 1080x1920 H.264 MP4 mit eingebrannten Untertiteln, das ffprobe bestätigt, plus den Zwischenartefakten (einer Cuts-Liste, einer .ass/.srt, einem Beat-Raster). Wenn du das Ergebnis nicht mit ffprobe prüfen und die Spezifikationen sehen kannst, bist du nicht fertig.
Zuständigkeitsbereich: Drei Fähigkeiten befassen sich mit „einem vertikalen Video“ – kenne deine Rolle
| Die Aufgabe | Geht an | Artefakt |
|---|---|---|
| Schreibe das Skript, den Hook, die Beats, den Text der Bildschirmuntertitel, das Edit Decision Sheet | ../video-shorts/SKILL.md | ein .md-Skript |
| Schneide/untertitele/exportiere echtes Filmmaterial, werkzeugunabhängig | hier | bearbeitetes .mp4 + Untertitel-/Cut-Dateien |
Baue ein Remotion-React-Kompositionsprojekt (<TransitionSeries>, Headless-Render) | ../remotion-video/SKILL.md | ein .tsx-Projekt |
Einzeiliger Router: Filmmaterial rein → geschnitten, untertitelt, exportiert → diese Fähigkeit. Wörter oder ein Plan → video-shorts. Eine React-Codebasis → remotion-video. Du bist die einzige der drei, die werkzeugunabhängig ist.
Wähle zuerst deinen Weg
Beginne nicht mit dem Schneiden, bevor du das Werkzeug gewählt hast. Die Wahl betrifft, wer es ausführt und ob es reproduzierbar sein muss.
| Situation | Route | Warum |
|---|---|---|
| Reproduzierbar / Batch / CI / „mach das mit 40 Clips“ | ffmpeg + WhisperX | scriptbar, deterministisch, keine GUI – gleiche Eingabe, gleiche Ausgabe |
| Das Repository ist bereits ein Remotion-Projekt | @remotion/captions | Nutze den vorhandenen Kompositionsgraphen; rufe keine externen Programme auf |
| Ein Mensch poliert ein Video manuell | CapCut-Klickpfad | am schnellsten für einen einzelnen, praxisnahen Durchgang mit automatischen Untertiteln und automatischen Beat-Markern |
Der Rest dieser Fähigkeit beschreibt die ffmpeg + WhisperX-Pipeline (den reproduzierbaren Weg), wobei die Remotion- und CapCut-Routen dort erwähnt werden, wo sie abweichen. Lange Befehlsblöcke befinden sich in references/ffmpeg-pipeline.md; die Untertitel-Details stehen in references/captions.md.
Die reproduzierbare Pipeline, in Reihenfolge
Dies ist das Rückgrat. Führe sie von oben nach unten aus; jeder Schritt speist den nächsten.
1. Extrahiere eine saubere Mono-16-kHz-Audiospur für die Transkription.
ffmpeg -i in.mp4 -vn -ac 1 -ar 16000 a.wav
Warum Mono 16 kHz: Das ist das, was Whisper-Modelle erwarten; die Verarbeitung von Stereo 48 kHz verschwendet Zeit und ändert nichts an der Genauigkeit.
2. Transkribiere mit Wort-Zeitstempeln. Segment-Zeitstempel reichen nicht – wortgenaue Untertitel benötigen Zeitangaben pro Wort.
whisperx a.wav --model large-v3 --output_format json --highlight_words True
WhisperX (v3.8.5) verwendet faster-whisper plus wav2vec2-Forced-Alignment und liefert Wort-Zeitangaben mit einer Genauigkeit von unter 100 ms – die Grundlage für Karaoke-Highlights. faster-whisper allein mit word_timestamps=True funktioniert (~10% Overhead), driftet aber stärker an Wortgrenzen. Warum Forced Alignment: Whispers native Wortstempel sind interpoliert und zittern; Forced Alignment verankert jedes Wort am Audio. Siehe references/captions.md für die Installation und die JSON-Struktur.
3. Erkenne Stille, schneide dann Video UND Audio gemeinsam. Das ist der Schritt, den die Leute falsch machen.
# Durchgang 1: Finde die stillen Bereiche (Sprachschwelle)
ffmpeg -i in.mp4 -af silencedetect=noise=-25dB:d=0.3 -f null - 2> silence.log
silenceremove allein ist ein Nur-Audio-Filter und desynchronisiert das Video – verwende es niemals als einmaligen Befehl. Analysiere die silence_start- / silence_end-Zeilen aus silence.log, invertiere sie in Keep-Bereiche und baue einen select- + aselect-Filter (oder einen trim+concat-Graphen), der dieselben Bereiche aus beiden Streams entfernt. Schwellenwerte: Sprache noise=-25dB:d=0.3; Musikteppich noise=-40dB:d=1. Das Snippet zur Filtergenerierung befindet sich in references/ffmpeg-pipeline.md.
4. Baue das Beat-Raster (nur wenn du im Takt der Musik schneidest).
python -c "import librosa; y,sr=librosa.load('music.wav'); \
_,b=librosa.beat.beat_track(y=y,sr=sr,units='time'); print(*b,sep='\n')" > beats.txt
beats.txt ist eine Liste von Beat-Zeiten in Sekunden. CapCut setzt diese Marker automatisch auf der Wellenform; librosa (oder aubio) liefert dir dasselbe Raster in einem Skript.
5. Richte Schnittpunkte und Zoom-Keyframes am nächsten Beat aus. Runde jede Schnittzeit auf den nächstgelegenen Wert in beats.txt. Ein Zoom-Punch auf den Beat wirkt energiegeladen; siehe Beat-Synchronisation unten, wann NICHT.
6. Brenne die Karaoke-.ass-Untertitel ein.
ffmpeg -i tightened.mp4 -vf "ass=captions.ass" -c:a copy captioned.mp4
Die .ass-Datei trägt die pro-Wort-\k-Zeitangaben, die aus den Wort-Zeitstempeln von Schritt 2 und den Safe-Zone-Rändern erstellt wurden. Details zur Generierung und die Vorlage findest du unter „Karaoke-Untertitel“ weiter unten.
7. Exportiere den plattformspezifischen Master (siehe Export-Spezifikationen).
Karaoke-Untertitel
Wortgenaue Untertitel sind der Markenzeichen-Look. Baue sie aus den Wort-Zeitstempeln, nicht aus den Segment-Zeitstempeln.
- Timing. Das Highlight jedes Wortes auf dem Bildschirm basiert auf seinem Forced-Alignment-Start/-Ende. In
.assbewegt das Tag\k<Zentisekunden>die Karaoke-Füllung pro Wort weiter. Wortgenaue Darstellung aus Segment-Timing zittert und setzt das Highlight auf das falsche Wort – verwende immer die pro-Wort-Stempel aus Schritt 2. - Lesbarkeit bei ausgeschaltetem Ton. Groß, fett, serifenlos, starke Kontur/Schatten, optionaler Schlagschatten. Leute schauen stumm: Wenn es auf dem Handy nicht auf einen Blick lesbar ist, ist es gescheitert. Halte es auf ≤ 2 Zeilen / ~6 Wörter gleichzeitig auf dem Bildschirm.
- Safe Zone – die nicht offensichtliche. Platziere Untertitel im vertikalen Mittelband, nicht unten. Die Benutzeroberfläche der Plattform (Symbole am rechten Rand, untere Bildschirmtitel/CTA/Profil) bedeckt die unteren ~15–20 % und den rechten Rand. Halte Untertitel und Schlüsseltext im zentralen ~80 % des
1080x1920-Bildes. Unten eingebrannte Untertitel werden hinter den TikTok-Buttons versteckt – das ist die häufigste Ursache für „meine Untertitel sind kaputt“.
Minimaler .ass-Style-Block (vollständige Vorlage in references/captions.md):
[V4+ Styles]
Style: Karaoke,Montserrat,64,&H00FFFFFF,&H0000FFFF,&H00000000,&H64000000,-1,0,0,0,100,100,0,0,1,5,2,5,80,80,640,1
MarginV (das nachfolgende 640) hebt die Zeile in das Mittelband; die starke Outline (5) sorgt für Lesbarkeit auf jedem Hintergrund.
Remotion-Route: Wenn du dich in einem Remotion-Projekt befindest, verwende @remotion/captions – createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds }) paginiert die Tokens. Niedrig (200–500 ms) = wortgenaues Einblenden; hoch (1200–2000 ms) = Phrasenseiten. durationMs der Seite wurde in v4.0.261 hinzugefügt. CapCut-Route: Text → Auto-Untertitel → Generieren, dann neu gestalten.
Beat-Synchronisation
Ein Beat-Raster (Schritt 4) ist eine Liste von Sekunden. Richte deine Schnittpunkte und Zoom-Keyframes am nächsten Beat aus, damit Bewegungen auf die Musik treffen.
- Schlecht → Gut. Ein Schnitt mitten im Wort, um genau auf einen Beat zu treffen, wirkt wie ein Fehler → rücke den Schnitt auf den nächsten Beat, der auch die Sprachgrenze respektiert. Ehre zuerst die Wörter, dann den Beat.
- Wann NICHT auf den Beat schneiden. Eine Talking-Head-Erklärung, bei der die Wörter den Wert ausmachen: Klarheit schlägt Rhythmus. Ein Beat-Schnitt mitten im Satz einer Person zerstört ihre Darbietung. Hebe die Beat-Synchronisation für B-Roll-Montagen, Übergänge und musikgeführte Abschnitte auf.
- Übergänge bleiben günstig und schnell. Harte Schnitte sind die Standardeinstellung. Whip-Pan oder Zoom-Punch nur auf einen Beat. Vermeide 1-Sekunden-Überblendungen in einem 30-Sekunden-Kurzvideo – sie töten das Tempo; ein Kurzvideo lebt von schnellen, harten Schnitten.
Export-Spezifikationen
Der universelle vertikale Master – eine Datei, die auf allen drei Plattformen sauber abgespielt wird:
ffmpeg -i captioned.mp4 \
-vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2,setsar=1" \
-c:v libx264 -profile:v high -pix_fmt yuv420p -r 30 \
-c:a aac -b:a 192k -ar 48000 -ac 2 \
-movflags +faststart out.mp4
yuv420p (breite Wiedergabe), +faststart (Web-Streaming beginnt vor vollständigem Download), AAC-LC 48 kHz. Verwende 30 fps; erhöhe auf 60 fps für hochbewegte Shorts.
| Plattform | Video-Bitrate | Hinweise |
|---|---|---|
| TikTok | ~2.000–4.000 kbps | die leichteste der drei |
| Instagram Reels | ~3.500–4.500 kbps | |
| YouTube Shorts (1080p) | ~8.000–15.000 kbps | bis zu ~53.000 für 4K/60 |
Ein einzelnes 1080x1920 H.264 MP4 @30 fps unter ~250 MB ist überall sicher. Überprüfe vor dem Versand:
ffprobe -v error -select_streams v:0 \
-show_entries stream=width,height,codec_name,avg_frame_rate out.mp4
Erwarte width=1080 height=1920 codec_name=h264. Die vollständigen plattformspezifischen Kodierungsflags und ffprobe-Behauptungen findest du in references/ffmpeg-pipeline.md.
Anti-Patterns
| Schlecht | Warum es bricht | Gut |
|---|---|---|
silenceremove als einmaliger Filter | Er ist nur für Audio; das Video läuft weiter → Audio/Video-Desynchronisation | silencedetect → Keep-Bereiche invertieren → select+aselect schneidet beide Streams |
| Wortuntertitel aus Segment-Zeitstempeln | Highlight zittert und landet auf dem falschen Wort | Forced-Alignment-Wortstempel (WhisperX / word_timestamps) |
| Untertitel im unteren 15–20 %-Bereich eingebrannt | Plattform-UI (Buttons, CTA, Profil) verdeckt sie | Platziere sie im vertikalen Mittelband, zentralen ~80 % |
| Ein Export für alle Plattformen wiederverwendet | Irgendwo über/unter dem Bitraten-Ziel | Plattformspezifische Bitrate oder sicherer universeller Master |
| 1-Sekunden-Überblendungen in einem 30-Sekunden-Kurzvideo | Tötet das Tempo; wirkt langsam | Harte Schnitte; Whip/Zoom nur auf einen Beat |
| Beat-Schnitt eines Talking-Heads mitten im Satz | Zerstört die Darbietung; Klarheit verloren | Beat-Synchronisation nur für B-Roll/Montage; Sprachgrenzen respektieren |
| Erneutes Ausführen der Kodierung, um „die Spezifikationen zu prüfen“ | Verschwendet Minuten; die Datei existiert bereits | ffprobe die Ausgabe; prüfen, nicht neu rendern |
| Hier den Untertiteltext oder den Hook schreiben | Das ist das Skript, nicht der Schnitt | Leite an ../video-shorts/SKILL.md weiter; du brennst nur ein |
ffmpeg überschreibt die Quelle direkt | Ein schlechtes Flag und das Original ist weg | Schreibe immer in eine neue Datei; lasse in.mp4 unberührt |
Überprüfung & Referenzen
bash scripts/verify.sh <output.mp4>– führtffprobeaus und prüftwidth=1080,height=1920(9:16), Video-Codech264, Audio-Codecaac, fps in{30, 60}, und dass eine zugehörige.srt/.ass-Untertiteldatei existiert und nicht leer ist. Ohneffprobefällt es auf eine Pfad-/Erweiterungsprüfung zurück. Schreibgeschützt; gibt 0 zurück, wenn das Ziel leer/sauber ist, sodass es nie falsch negativ ist. Das Urteil „fühlt es sich im Takt an“ ist nicht mechanisch – das liegt in der Fähigkeitsbewertung.references/ffmpeg-pipeline.md– die vollständige Silence-Erkennung → Invertierung der Keep-Bereiche →select/aselect-Filtergenerierung, die Video+Audio zusammen schneidet, der concat/trim-Ansatz, plattformspezifische Kodierungsflags,ffprobe-Behauptungen und Fehlerbehebung bei Desynchronisation/Audio-Drift/faststart.references/captions.md– WhisperX-Installation + Ausführung, die JSON-Struktur der Wort-Zeitstempel, die vollständige.ass-Karaoke-Vorlage mit Safe-Zone-Rändern, das RemotioncreateTikTokStyleCaptions()-Snippet mitcombineTokensWithinMilliseconds-Anleitung und der Kompromiss zwischen faster-whisper und WhisperX.