Communitygithub.com

LiliLIN0324/imgseq-cover-video-skill

Crée une vidéo mp4 de couverture/teaser à partir d'un dossier d'images fixes nommées numériquement (01.jpg, 02.jpg, ... jusqu'à 200 et plus). Utilisez-le lorsque l'utilisateur demande de transformer un dossier d'images numérotées en vidéo, de créer un flip-book ou un diaporama, d'ajouter des transitions fondues entre les images, ou d'exporter une vidéo « cover » à partir de jpg dans un dossier — en ignorant les images non numérotées comme logo.jpg, discord.jpg ou cover.mp4.

Qu'est-ce que imgseq-cover-video-skill ?

Ce skill transforme un dossier d'images nommées uniquement par des chiffres (par exemple 01.jpg, 200.jpg) en une vidéo mp4 H.264 de type « cover » ou teaser, avec transition par fondu enchaîné par défaut ou coupure franche si demandé. Il ignore automatiquement toute image non numérique (logo.jpg, discord.jpg) et tout fichier vidéo existant. Les instructions incluent une inspection préalable du dossier avec ffprobe, une sauvegarde de l'éventuelle cover.mp4 existante, l'exécution du script Python `imgseq2mp4.py` avec paramètres par défaut (0,8s par image, fondu de 0,2s, 30ips, 1920x1080, CRF 18), puis une vérification de la qualité (durée, absence d'images noires, comparaison de la dernière trame). Le skill gère les cas de saturation mémoire (limitation à 6 encodeurs simultanés avec groupement) et les chemins d'accès à ffmpeg non standard. Il est conçu pour fonctionner avec n'importe quel dossier d'images numérotées, sous Windows avec DSH ou tout autre environnement où ffmpeg n'est pas sur le PATH.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add LiliLIN0324/imgseq-cover-video-skill

Demander à votre IA préférée

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

Documentation

叠帧 · Numérotées → Vidéo Cover

Aperçu

Parcourez un dossier, ne conservez que les fichiers dont le nom est purement numérique (01.jpg, 200.jpg), jouez-les dans l'ordre numérique et encodez un mp4 H.264. Entre les images, vous pouvez soit faire une coupure franche (--transition none) soit un fondu enchaîné (--transition fade, par défaut). Les images non numérotées (logo, discord, …) et les vidéos existantes sont ignorées.

Procédure

  1. Inspectez d'abord le dossier. Listez les fichiers et sondez les dimensions d'une image avec ffprobe. Notez combien d'images numérotées existent et si les ratios sont mélangés.
  2. Sauvegardez toute sortie existante. Si <dossier>/cover.mp4 existe déjà, renommez-le en cover.prev-AAAAMMJJ.mp4 avant de générer. Ne jamais écraser silencieusement un précédent rendu de l'utilisateur.
  3. Générez avec le script fourni :
python "<skill-dir>/scripts/imgseq2mp4.py" --dir "<dossier>" --out cover.mp4

Valeurs par défaut : 0,8 s par image avec un fondu fade de 0,2 s, 30 ips, 1920x1080, lettre-boîte, CRF 18, pas d'audio, +faststart.

  1. Vérifiez, ne présumez pas. Sondez la durée/le nombre d'images, confirmez l'absence d'images noires et extrayez la dernière image pour la comparer à la dernière source :
ffprobe -v error -show_entries format=duration -show_entries stream=nb_frames -of default=nw=1 cover.mp4
ffmpeg -i cover.mp4 -vf blackdetect=d=0.05:pix_th=0.10 -an -f null -
ffmpeg -y -sseof -0.05 -i cover.mp4 -frames:v 1 frame_last.png

Lorsque les transitions sont activées, saisissez également une image à l'intérieur de la première fenêtre de transition et vérifiez qu'il s'agit d'un mélange (plus proche de l'image 2 qu'une coupure franche ne le serait, mais toujours mesurablement différent des deux sources).

  1. Rapportez le nombre d'images, les images ignorées, la durée totale, le chemin et la taille de la sortie.

Cadence

Longueur totale = n × secondes − (n−1) × secondes_transition. L'étape d'affichage de chaque image est secondes − secondes_transition ; c'est cette étape, et non --seconds, que le spectateur perçoit.

Étape par imageCommande20 imgs44 imgs200 imgs
0,35 s--seconds 0.5 --transition-seconds 0.15~8 s~18 s~75 s
0,45 s--seconds 0.65 --transition-seconds 0.2~9 s~22 s~95 s
0,60 s (par défaut)--seconds 0.8 --transition-seconds 0.2~12 s~27 s~120 s
0,80 s--seconds 1.0 --transition-seconds 0.2~16 s~34 s~150 s

Les coupures franches utilisent --transition none --seconds <étape>.

Déplacez-vous d'une ligne à la fois lorsque l'utilisateur demande plus rapide ou plus lent. Gardez --transition-seconds entre 0,15 et 0,2 ; plus long commence à ressembler à un diaporama plutôt qu'à un fondu enchaîné.

Règles

  • Fondu enchaîné uniquement. N'utilisez pas de transitions de glissement, rideau ou autres poussées — elles ont été rejetées comme direction.
  • Sélectionnez avec l'expression régulière ^\d+\.(jpe?g|png|webp)$ — le nom de fichier doit être uniquement des chiffres. C'est ce qui exclut logo.jpg, discord.jpg, cover.jpg.
  • Triez par valeur entière, pas par ordre lexicographique (2.jpg avant 10.jpg, 99.jpg avant 100.jpg). Les lacunes dans la numérotation ne posent pas de problème ; les numéros manquants ne sont pas des erreurs.
  • Utilisez --fit pad (par défaut) pour que l'image entière reste visible. N'utilisez --fit fill que lorsque l'utilisateur souhaite explicitement un recadrage bord à bord.
  • La sortie est silencieuse. N'ajoutez pas de musique à moins que l'utilisateur ne fournisse une piste.
  • Ne touchez pas aux couleurs. Les JPEG sont en gamme dynamique complète ; si vous les encodez en H.264 non balisé en gamme dynamique complète, la plupart des lecteurs décodent en gamme dynamique limitée et le résultat semble plus lumineux et délavé (+10 niveaux). Le script convertit en bt709 en gamme dynamique limitée et le balise — ne « simplifiez » pas cette chaîne.
  • Le script refuse d'écraser --out sans --force ; résolvez par une sauvegarde, pas en forçant aveuglément.

Notes machine

  • ffmpeg n'est pas dans le PATH. Le script préfère un véritable ffmpeg.exe (~/.dsh/tools/ffmpeg/**/ffmpeg.exe, puis cherche sous C:/ ou D:/ffmpeg) avant tout .cmd shim, car le shim passe par cmd.exe et limite la ligne de commande à environ 8k caractères. Surchargez avec FFMPEG=/chemin/vers/ffmpeg.
  • Cette version manque de -filter_complex_script ; transmettez le graphe xfade en ligne via -filter_complex (le script le fait déjà).
  • Les transitions sont rendues par groupes de --chunk (par défaut 6) puis fusionnées, de sorte qu'au maximum 6 décodeurs sont ouverts simultanément. Un seul passage xfade à 44 entrées a épuisé la RAM sur une machine de 16 Go (~2,4 Go libres) et a échoué avec Cannot allocate memory ; ne passez pas --chunk au-dessus de ~8 ici. Le groupement est récursif, donc 200 images fusionnent en trois étapes sans OOM.
  • Les fichiers d'étape intermédiaires sont encodés en CRF 14 / veryfast et supprimés ; seul le passage final utilise --crf / medium.
  • Les images intermédiaires ont besoin d'un répertoire accessible en écriture. Les résultats de tempfile.mkdtemp() peuvent être inaccessibles dans des sandbox restreints (observé sur Windows + DSH : ffmpeg a obtenu Permission denied et os.listdir a levé WinError 5). Le script crée donc un répertoire simple, prouve qu'il est accessible en écriture, et utilise un repli via $IMGSEQ_WORKDIR → temp système → <out-dir>/.imgseq-work.

Ressources

  • scripts/imgseq2mp4.py — sélection, tri numérique, rendu par coupure franche ou fondu enchaîné, résumé facile à vérifier.

Skills associés