Intro und Outro hinzufügen
Die Einblendungen sind kurze MP4s mit eigenem Jingle, ein Paar pro Ausrichtung, in den Präferenzen aufgelistet. Diese Skill normalisiert alles auf ein einheitliches Format, fügt Intro, Video und Outro mit kurzen Überblendungen (Video und Audio) zusammen und rendert das Ergebnis.
Präferenzen
remote-video-editing/preferences.json (Lookup-Reihenfolge wie in clean-voice-sidon):
| Schlüssel | Bedeutung |
|---|---|
stings | {"intro_16x9": url, "outro_16x9": url, "intro_9x16": url, "outro_9x16": url}; URLs oder lokale Pfade |
sting_fade_s | Überblendungslänge, Standard 0.5 |
render_notes | Wo lange Encodes ausgeführt werden sollen (z. B. ein Server statt eines Laptops). Folge ihnen. |
Wenn stings nicht gesetzt ist, frage nach den Dateien. Das Plugin enthält keine Marken-Assets.
Ausrichtung
Lies die angezeigte Ausrichtung, nicht die codierte Größe: Handys speichern Portrait-Videos als 1920x1080 mit einem Rotations-Tag.
Überprüfe mit
ffprobe -v error -select_streams v:0 -show_entries stream=width,height:stream_side_data=rotation -of compact IN.
Eine Rotation von 90 oder -90 vertauscht Breite und Höhe. ffmpeg wendet die Rotation beim Dekodieren automatisch an.
- Portrait (9:16) Video:
intro_9x16/outro_9x16verwenden, Leinwand 1080x1920. - Landscape: das 16:9-Paar verwenden, Leinwand 1920x1080.
- 16:9-Schnitt eines Portrait-Videos (für YouTube-Hauptfeed): Leinwand 1920x1080, das Video auf 1080 Höhe skaliert in der
Mitte, über einer unscharfen, abgedunkelten, gezoomten Kopie von sich selbst; 16:9-Einblendungen verwenden. Die
[v1]-Kette unten wird zu:
Teste es an einem 8-Sekunden-Ausschnitt ([1:v]fps=30,split[a][b]; [a]scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,scale=480:270,boxblur=20:2,scale=1920:1080,eq=brightness=-0.06:saturation=0.9[bg]; [b]scale=-2:1080[fg];[bg][fg]overlay=(W-w)/2:0,setsar=1,format=yuv420p[v1]-ss 60 -t 8) und zeige ein Einzelbild, bevor das gesamte Video gerendert wird.
Rendern
W:H ist die Leinwand, F die Überblendung (0,5), DI die Intro-Dauer, DV die Video-Dauer (ffprobe format=duration).
Offsets: erste Überblendung bei DI-F; zweite bei DI+DV-2*F.
ffmpeg -y -i intro.mp4 -i main.mp4 -i outro.mp4 -filter_complex "
[0:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v0];
[1:v]fps=30,scale=W:H:force_original_aspect_ratio=decrease,pad=W:H:(ow-iw)/2:(oh-ih)/2,setsar=1,format=yuv420p[v1];
[2:v]fps=30,scale=W:H,setsar=1,format=yuv420p[v2];
[0:a]aresample=48000,aformat=channel_layouts=stereo[a0];
[1:a]aresample=48000,aformat=channel_layouts=stereo[a1];
[2:a]aresample=48000,aformat=channel_layouts=stereo[a2];
[v0][v1]xfade=transition=fade:duration=F:offset=DI-F[v01];
[v01][v2]xfade=transition=fade:duration=F:offset=DI+DV-2*F[v];
[a0][a1]acrossfade=d=F[a01];[a01][a2]acrossfade=d=F[a]" \
-map "[v]" -map "[a]" -c:v libx264 -preset medium -crf 20 -maxrate 10M -bufsize 20M -c:a aac -b:a 192k -movflags +faststart out.mp4
- Mehrere Quellclips: zuerst zusammenfügen (gleiches Filter-Muster oder den concat-Demuxer, wenn sie denselben Codec teilen), dann
das Ergebnis als
main.mp4behandeln. - Dies ist eine vollständige Neucodierung: Minuten pro Kern für ein 10-minütiges 1080p-Video. Führe es auf Modal aus, nicht lokal und
nicht auf einem Heimserver: setze die Argumente nach den Eingaben (von
-filter_complexbis+faststart) zeilenweise inrender.args, dann$MODAL run "${CLAUDE_PLUGIN_ROOT}/scripts/ffmpeg_modal.py" --inputs intro.mp4,main.mp4,outro.mp4 --args-file render.args --out out.mp4(modal_commandundrun_notesaus den Präferenzen sagen, wo Modal läuft). Füge mehrere Clips im selben Graphen zusammen (concat-Filter) anstatt in einem separaten Durchlauf. Lösche den Job-Ordner im Volumevideo-editing-workanschließend. - xfade benötigt beide Eingaben auf derselben Zeitbasis: setze
fps=30,settb=1/30auf jeden Video-Zweig (auch nach einemconcat), sonst schlägt ffmpeg fehl mit „First input link main timebase (1/30) do not match". - Bitrate: behalte die Begrenzung (
-crf 20 -maxrate 10M -bufsize 20M). Einfache CRF 18 bei verrauschtem Handy-Material ergab 24 Mbps, etwa 2 GB für 11 Minuten (2026-11-13). YouTube codiert ohnehin neu und empfiehlt 8-12 Mbps für 1080p-Uploads. - Überprüfung: Die Ausgabedauer sollte etwa
DI + DV + DO - 2*Fbetragen, und überprüfe Einzelbilder beiDI-F/2(Mitte der Überblendung), in der Mitte und am Ende.
Handyaufnahmen: Stabilisierung im selben Render
Handyvideos, die aus der Hand aufgenommen wurden, profitieren von einer leichten Stabilisierung (der Benutzer, 2026-11-13, nachdem das erste Hebrish-Wochenend-Update ohne sie ausgeliefert wurde). Verwende ffmpegs vid.stab (libvidstab; Debiens ffmpeg, das das Modal-Image installiert, hat es; prüfe mit ffmpeg -filters | grep vidstab). Zwei Durchläufe, beide auf Modal:
- Detect (schnell, nur Analyse, schreibt eine Transformationsdatei), pro Quellclip:
ffmpeg -i main.mp4 -vf vidstabdetect=shakiness=5:accuracy=15:result=main.trf -f null -Führe es als eigenenffmpeg_modal.py-Job aus (args-vf/vidstabdetect=...:result=/work/<job>/main.trf/-f/null, Ausgabe-), oder füge einen Detect-Schritt zum Skript hinzu. Die.trfmuss neben der Eingabe im Volume liegen. - Transform innerhalb des Hauptrenders, als erstes auf dem Video-Zweig dieses Clips, vor Grading und Skalierung:
vidstabtransform=input=main.trf:smoothing=20:zoom=2:optzoom=0,unsharp=5:5:0.4smoothingum 15-30 (Frames) behält natürliche Bewegungen; ein festeszoom=2(Prozent) verdeckt die beweglichen Ränder, ohne das Pumpen, dasoptzoom=1bei einem sprechenden Kopf verursacht. Das leichte Unsharp gleicht die Weichzeichnung durch Resampling aus.
Teste zuerst an einem 8-Sekunden-Ausschnitt und vergleiche ein Standbild und einen kurzen Clip mit dem Benutzer vor dem vollständigen Rendern. Wenn
libvidstab fehlt, ist deshake eine One-Pass-Notlösung (schwächer). KI-Stabilisierungen werden dafür nicht benötigt.
Erstellen von Einblendungen
Die verwendeten Einblendungen wurden aus den Marken-SVGs mit einem kleinen Pillow-Skript plus einem generierten Jingle gerendert. Finde es
mit find-script (Tags logo, sting, intro), und generiere das Logo nicht mit einem Video-Modell: Video-Modelle
verzerren Buchstabenformen.