Communitygithub.com

aminmzadev/ffmpeg-pipeline

Transformez des images fixes en vidéo et effectuez des opérations multimédia depuis le terminal — mouvements Ken Burns, fondus enchaînés, mixage de narration, planches contact, extraction d'images, GIFs, normalisation du volume et changements de vitesse. Utilisez-le quand l'utilisateur souhaite une vidéo, un diaporama, un extrait, une planche contact d'une vidéo, ou doit combiner, rogner ou normaliser audio et vidéo.

Qu'est-ce que ffmpeg-pipeline ?

Cette compétence transforme des images fixes (générées ou fournies) en vidéos MP4 animées avec narration, et gère les tâches médiatiques courantes qu'un agent rencontre fréquemment. Elle prend en charge une large gamme d'opérations : création de vidéos avec mouvement de zoom (Ken Burns) et fondus enchaînés, diaporamas, mixage audio, extraction d'images, planches contact, génération de GIF optimisés, normalisation audio à -16 LUFS, et changement de vitesse audio sans déformation. La compétence nécessite `ffmpeg` et `ffprobe`, et utilise `anon-image` et `anon-audio` en option pour la génération d'images et de narration. Elle inclut des règles de décision pratiques pour les ratios (16:9 pour YouTube, 9:16 pour Shorts, 1:1 pour les flux), les durées par plan (3-4 secondes recommandées), et le mixage audio (musique à 12% sous la voix). Les modes de défaillance courants sont documentés, et la compétence gère automatiquement le bouclage ou le remplissage de l'audio pour correspondre à la durée vidéo. Livrée en résolution 720p par défaut pour des performances optimales, elle exécute toujours une commande `info` sur le résultat final pour vérifier la durée, la résolution et la taille.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/aminmzadev/keyless-agent-skills/tree/main/ffmpeg-pipeline

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 ffmpeg-pipeline ?

La compétence de collage. Elle transforme des images fixes (générées ou fournies) en MP4 animé avec narration, et effectue les tâches médiatiques banales qu'un agent rencontre constamment.

Nécessite ffmpeg + ffprobe. A besoin d'anon-image pour le mode génération d'images et d'anon-audio pour --narration ; les deux sont découverts automatiquement comme des compagnons, et les deux sont optionnels si vous passez --images / --audio à la place.

Commandes

CommandeCe qu'elle fait
videoimages fixes (générées ou depuis --images) → MP4 avec mouvement zoompan + fondus enchaînés, narration et fond musical optionnels
slideshowimages existantes → MP4
muxattacher une piste audio à une vidéo, en bouclant/remplissant pour l'ajuster
framesextraire des images fixes toutes les N secondes
sheetplanche contact (N images espacées régulièrement avec horodatages)
gifGIF recadré, optimisé en palette, depuis n'importe quelle section
normalizenormaliser le volume audio à -16 LUFS
speedchanger la vitesse audio sans déformation (atempo enchaîné)
inforésumé ffprobe en une ligne
probevérification des dépendances

Démarrage rapide

# tout le pipeline en un appel : 3 plans générés, 4 s chacun, narré
vidkit.py video "un phare sur une falaise de basalte au crépuscule, cinématographique" -o story.mp4 \
  --shots 3 --seconds 4 --ratio 16:9 \
  --narration "Quelque part sur une côte froide, un phare veille." \
  --voice en-GB-RyanNeural

# réutiliser des images que vous avez déjà
vidkit.py video --images shots/ -o out.mp4 --seconds 3 --music bed.mp3

# chirurgie médiatique
vidkit.py mux clip.mp4 voiceover.mp3 -o final.mp4
vidkit.py sheet final.mp4 -o preview.jpg --cols 4 --count 8
vidkit.py gif final.mp4 -o teaser.gif --start 1 --dur 2.5 --width 480
vidkit.py normalize voiceover.mp3 -o clean.mp3
vidkit.py info final.mp4

Calculs de durée (pour prédire le résultat)

Avec N plans de S secondes et un fondu enchaîné de 0,8 s :

durée = N*S - (N-1)*0,8

3 × 4 s → 10,4 s. Si la narration est plus longue que l'image, la vidéo boucle pour la couvrir (-stream_loop). Si elle est plus courte, l'audio est rempli de silence pour ne jamais perdre la fin. Les deux cas sont gérés — n'ajoutez pas -shortest vous-même.

Règles de décision

  • Ratio : 16:9 pour YouTube/web, 9:16 pour Shorts/Reels/TikTok, 1:1 pour les flux et miniatures. Tout est mis à l'échelle pour couvrir puis recadré, donc les images sources de toute forme survivent sans letterboxing.
  • Secondes par plan : 3–4 s convient pour une image fixe ; plus de 6 s d'une image statique donne une sensation de mort. Si vous avez besoin de plus de temps, ajoutez des plans, pas des secondes.
  • Fond musical : passez --music et il est mixé à 12 % sous la voix. Ne mélangez pas deux sources fortes ; normalisez d'abord.
  • GIF : gardez la largeur ≤ 480 et la durée ≤ 3 s, sinon le fichier dépasse les limites de discussion.

Modes de défaillance

SymptômeCauseSolution
missing dependency: ffmpegpas installéapt install ffmpeg (ou brew install ffmpeg)
ffmpeg failed: … Invalid argument sur zoompandimensions source impairesle filtre met déjà à l'échelle à W*2 ; si vous l'avez modifié, gardez des nombres pairs
la sortie est silencieusefichier de narration manquant/videvérifiez le chemin ; --narration accepte soit du texte, soit un chemin audio
la sortie est beaucoup plus courte que prévul'audio est plus court que la vidéo et quelque chose a ajouté -shortestretirez-le ; vidkit.py remplit à la place
contact sheet needs Pillowpas de Pillowpip install pillow, ou utilisez frames + votre propre planche

Notes pour l'agent

  • Rendez en 720p sauf si l'utilisateur demande plus. C'est 4× plus rapide et personne ne fait la différence sur un écran d'ordinateur portable.
  • Exécutez toujours info sur l'artefact final et citez la durée réelle, la résolution et la taille à l'utilisateur — cela détecte les échecs silencieux.
  • Livrez le chemin du MP4 ; ne l'incorporez pas. Le fichier est l'artefact.

Skills associés