Communitygithub.com

Ajouter l’intro et l’outro

Ajoute les bandes d’intro et d’outro de la marque sur une vidéo terminée, avec stabilisation optionnelle vid.stab pour les séquences filmées à main levée, en choisissant la paire 16:9 ou 9:16 selon l’orientation de la vidéo, avec un fondu court de l’intro vers la vidéo et de la vidéo vers l’outro. Génère également un recadrage 16:9 d’une vidéo verticale avec un fond flou.

Qu'est-ce que Ajouter l’intro et l’outro ?

Cette compétence automatise l’ajout d’intros et d’outros de marque à des vidéos terminées, en respectant leur orientation (paysage 16:9 ou portrait 9:16). Elle normalise les formats, applique des fondus enchaînés audio et vidéo, et peut même produire une version paysage 16:9 pour YouTube à partir d’une vidéo verticale, en utilisant un fond flou et assombri. Elle intègre aussi une stabilisation optionnelle via vid.stab pour les séquences filmées à main levée, avec un réglage précis pour éviter l’effet pompage. Conçue pour fonctionner sur Modal afin de gérer les longs rendus, elle analyse l’orientation via ffprobe et propose des vérifications intermédiaires sur des extraits courts. Les préférences (chemins des fichiers d’intro/outro, durée du fondu) sont lues depuis un fichier JSON, et le rendu complet utilise ffmpeg avec des commandes préconfigurées mais adaptables.

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Ajouter l’intro et l’outro ?

Les bandes sont de courts fichiers MP4 avec leur propre jingle, une paire par orientation, listées dans les préférences. Cette compétence normalise le tout dans un même format, assemble l’intro, la vidéo et l’outro avec de courts fondus enchaînés (vidéo et audio), et rend le résultat.

Préférences

remote-video-editing/preferences.json (ordre de recherche comme dans clean-voice-sidon) :

CléSignification
stings{"intro_16x9": url, "outro_16x9": url, "intro_9x16": url, "outro_9x16": url} ; URLs ou chemins locaux
sting_fade_sDurée du fondu, par défaut 0.5
render_notesOù exécuter les longs encodages (par exemple un serveur plutôt qu’un ordinateur portable). Suivez-les.

Si stings n’est pas défini, demandez les fichiers. Le plugin ne fournit aucun élément de marque.

Orientation

Lisez l’orientation affichée, pas la taille réelle : les téléphones stockent la vidéo portrait en 1920×1080 avec une étiquette de rotation. Vérifiez avec ffprobe -v error -select_streams v:0 -show_entries stream=width,height:stream_side_data=rotation -of compact IN. Une rotation de 90 ou -90 échange largeur et hauteur. ffmpeg applique la rotation automatiquement lors du décodage.

  • Vidéo portrait (9:16) : utilisez intro_9x16 / outro_9x16, toile 1080×1920.
  • Paysage : utilisez la paire 16:9, toile 1920×1080.
  • Recadrage 16:9 d’une vidéo portrait (pour le fil principal YouTube) : toile 1920×1080, la vidéo mise à l’échelle à 1080 de haut au centre, par-dessus une copie floutée, assombrie et zoomée d’elle-même ; utilisez les bandes 16:9. La chaîne [v1] ci-dessous devient :
    [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]
    
    Testez-le sur un extrait de 8 secondes (-ss 60 -t 8) et affichez une image avant de rendre l’ensemble.

Rendu

W:H est la toile, F le fondu (0,5), DI la durée de l’intro, DV la durée de la vidéo (ffprobe format=duration). Décalages : premier fondu à DI-F ; second à 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
  • Plusieurs sources : assemblez-les d’abord (même motif de filtre, ou le démultiplexeur concat s’ils partagent un codec), puis traitez le résultat comme main.mp4.
  • C’est un ré-encodage complet : plusieurs minutes de chaque cœur pour une vidéo 1080p de 10 minutes. Exécutez-le sur Modal, pas localement et pas sur un serveur domestique : mettez les arguments après les entrées (de -filter_complex à +faststart) un par ligne dans render.args, puis $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 et run_notes des préférences indiquent où Modal s’exécute). Assemblez plusieurs clips dans le même graphe (filtre concat) plutôt qu’en une passe séparée. Supprimez le dossier du travail dans le volume video-editing-work ensuite.
  • xfade nécessite que les deux entrées aient la même base de temps : mettez fps=30,settb=1/30 sur chaque branche vidéo (y compris après un concat), sinon ffmpeg échoue avec “First input link main timebase (1/30) do not match”.
  • Débit : gardez la limite (-crf 20 -maxrate 10M -bufsize 20M). Un CRF 18 simple sur des séquences bruitées de téléphone donnait 24 Mbps, soit environ 2 Go pour 11 minutes (2026-11-13). YouTube ré-encode de toute façon et suggère 8-12 Mbps pour les téléchargements 1080p.
  • Vérifiez : la durée de sortie est d’environ DI + DV + DO - 2*F, et examinez les images à DI-F/2 (milieu du fondu), au milieu et à la fin.

Séquences filmées à main levée : stabilisation dans le même rendu

Les vidéos filmées à main levée au téléphone bénéficient d’une légère stabilisation (l’utilisateur, 2026-11-13, après que la première mise à jour du week-end Hebrish soit sortie sans). Utilisez vid.stab de ffmpeg (libvidstab ; le ffmpeg de Debian, que l’image Modal installe, le contient ; vérifiez avec ffmpeg -filters | grep vidstab). Deux passes, toutes deux sur Modal :

  1. Détection (rapide, analyse seule, écrit un fichier de transformations), par clip source : ffmpeg -i main.mp4 -vf vidstabdetect=shakiness=5:accuracy=15:result=main.trf -f null - Exécutez-la comme son propre travail ffmpeg_modal.py (args -vf / vidstabdetect=...:result=/work/<job>/main.trf / -f / null, sortie -), ou ajoutez une étape de détection au script. Le fichier .trf doit se trouver à côté de l’entrée dans le volume.
  2. Transformation dans le rendu principal, en premier sur la branche vidéo de ce clip, avant l’étalonnage et la mise à l’échelle : vidstabtransform=input=main.trf:smoothing=20:zoom=2:optzoom=0,unsharp=5:5:0.4 smoothing entre 15 et 30 (images) conserve le mouvement naturel ; un zoom=2 fixe (pourcentage) cache les bords mobiles sans l’effet pompage que optzoom=1 provoque sur un visage parlant. Le léger unsharp compense la douceur due au ré-échantillonnage.

Testez d’abord sur un extrait de 8 secondes et comparez une image fixe et un court clip avec l’utilisateur avant le rendu complet. Si libvidstab manque, deshake est un repli en une passe (plus faible). Les stabilisateurs IA ne sont pas nécessaires pour cela.

Fabrication des bandes

Les bandes utilisées ont été rendues à partir des SVG de la marque avec un petit script Pillow plus un jingle généré. Trouvez-le avec find-script (tags logo, sting, intro), et ne régénérez pas le logo avec un modèle vidéo : les modèles vidéo déforment les lettres.

Skills associés