叠帧 · 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
- 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.
- Sauvegardez toute sortie existante. Si
<dossier>/cover.mp4existe déjà, renommez-le encover.prev-AAAAMMJJ.mp4avant de générer. Ne jamais écraser silencieusement un précédent rendu de l'utilisateur. - 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.
- 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).
- 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 image | Commande | 20 imgs | 44 imgs | 200 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 exclutlogo.jpg,discord.jpg,cover.jpg. - Triez par valeur entière, pas par ordre lexicographique (
2.jpgavant10.jpg,99.jpgavant100.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 fillque 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
--outsans--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 sousC:/ouD:/ffmpeg) avant tout.cmdshim, car le shim passe par cmd.exe et limite la ligne de commande à environ 8k caractères. Surchargez avecFFMPEG=/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é avecCannot allocate memory; ne passez pas--chunkau-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 obtenuPermission deniedetos.listdira 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.