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_s | Durée du fondu, par défaut 0.5 |
render_notes | Où 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 :
Testez-le sur un extrait de 8 secondes ([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) 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 dansrender.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_commandetrun_notesdes préférences indiquent où Modal s’exécute). Assemblez plusieurs clips dans le même graphe (filtreconcat) plutôt qu’en une passe séparée. Supprimez le dossier du travail dans le volumevideo-editing-workensuite. xfadenécessite que les deux entrées aient la même base de temps : mettezfps=30,settb=1/30sur chaque branche vidéo (y compris après unconcat), 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 :
- 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 travailffmpeg_modal.py(args-vf/vidstabdetect=...:result=/work/<job>/main.trf/-f/null, sortie-), ou ajoutez une étape de détection au script. Le fichier.trfdoit se trouver à côté de l’entrée dans le volume. - 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.4smoothingentre 15 et 30 (images) conserve le mouvement naturel ; unzoom=2fixe (pourcentage) cache les bords mobiles sans l’effet pompage queoptzoom=1provoque 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.