Communitygithub.com

Intro-Outro hinzufügen

Fügt einem fertigen Video die Brand-Intro- und Outro-Einblendungen des Benutzers hinzu (mit optionaler vid.stab-Stabilisierung für Handyaufnahmen), wählt das 16:9- oder 9:16-Paar passend zur Video-Orientierung und erzeugt einen kurzen Überblendungseffekt vom Intro ins Video und vom Video ins Outro. Erstellt außerdem einen 16:9-Schnitt eines vertikalen Videos mit unscharfem Hintergrund.

Was ist Intro-Outro hinzufügen?

Diese Skill fügt einem fertigen Video die Marken-Intro- und Outro-Einblendungen des Benutzers hinzu. Sie normalisiert alle Eingaben auf ein einheitliches Format, fügt Intro, Hauptclip und Outro mit kurzen Überblendungen (Video und Audio) zusammen und rendert das Ergebnis. Die Skill unterstützt sowohl Hochformat- (9:16) als auch Querformat-Videos (16:9) und kann aus einem Hochformat-Video automatisch eine 16:9-Version mit unscharfem, verdunkeltem Hintergrund erstellen – ideal für YouTube-Uploads. Optional kann eine leichte Stabilisierung mit ffmpegs vid.stab für verwackelte Handyaufnahmen in den Render-Vorgang integriert werden. Die Skill hinterlegt Präferenzen für die Einblendungs-URLs und die Überblendungslänge und führt aufwändige Encodes standardmäßig auf Modal aus, um die lokale Rechenlast zu minimieren.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/danielrosehill/Remote-Video-Editing/tree/HEAD/skills/add-intro-outro

In Ihrer bevorzugten KI fragen

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

Dokumentation

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üsselBedeutung
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_notesWo 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_9x16 verwenden, 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:
    [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]
    
    Teste es an einem 8-Sekunden-Ausschnitt (-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.mp4 behandeln.
  • 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_complex bis +faststart) zeilenweise in render.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_command und run_notes aus 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 Volume video-editing-work anschließend.
  • xfade benötigt beide Eingaben auf derselben Zeitbasis: setze fps=30,settb=1/30 auf jeden Video-Zweig (auch nach einem concat), 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*F betragen, und überprüfe Einzelbilder bei DI-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:

  1. 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 eigenen ffmpeg_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 .trf muss neben der Eingabe im Volume liegen.
  2. 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.4 smoothing um 15-30 (Frames) behält natürliche Bewegungen; ein festes zoom=2 (Prozent) verdeckt die beweglichen Ränder, ohne das Pumpen, das optzoom=1 bei 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.

Verwandte Skills