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
| Commande | Ce qu'elle fait |
|---|---|
video | images fixes (générées ou depuis --images) → MP4 avec mouvement zoompan + fondus enchaînés, narration et fond musical optionnels |
slideshow | images existantes → MP4 |
mux | attacher une piste audio à une vidéo, en bouclant/remplissant pour l'ajuster |
frames | extraire des images fixes toutes les N secondes |
sheet | planche contact (N images espacées régulièrement avec horodatages) |
gif | GIF recadré, optimisé en palette, depuis n'importe quelle section |
normalize | normaliser le volume audio à -16 LUFS |
speed | changer la vitesse audio sans déformation (atempo enchaîné) |
info | résumé ffprobe en une ligne |
probe | vé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:9pour YouTube/web,9:16pour Shorts/Reels/TikTok,1:1pour 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
--musicet 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ôme | Cause | Solution |
|---|---|---|
missing dependency: ffmpeg | pas installé | apt install ffmpeg (ou brew install ffmpeg) |
ffmpeg failed: … Invalid argument sur zoompan | dimensions source impaires | le filtre met déjà à l'échelle à W*2 ; si vous l'avez modifié, gardez des nombres pairs |
| la sortie est silencieuse | fichier de narration manquant/vide | vérifiez le chemin ; --narration accepte soit du texte, soit un chemin audio |
| la sortie est beaucoup plus courte que prévu | l'audio est plus court que la vidéo et quelque chose a ajouté -shortest | retirez-le ; vidkit.py remplit à la place |
contact sheet needs Pillow | pas de Pillow | pip 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
infosur 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.