3.1 KiB
Design — Script réutilisable de stop motion
Date : 2026-08-31 Statut : validé par l'utilisateur
Contexte
Le projet contient un dossier images/ (42 photos HEIC 3056x3056, prises par iPhone, triées par nom = ordre chronologique) et une vidéo stop_motion.mp4 générée manuellement avec ffmpeg (12 fps, 1080x1080, 3,5 s). Le build ffmpeg installé (8.1.2, Homebrew) décode le HEIC mais ne supporte pas -pattern_type glob ; la génération manuelle a utilisé le concat demuxer avec un fichier ffconcat.
Objectif : un script réutilisable pour regénérer la vidéo depuis n'importe quel dossier d'images, sans dépendance au-delà de ffmpeg.
Décisions
- Approche choisie : script bash unique (
stopmotion.sh) à la racine. Les alternatives (Python/argparse, Makefile) ont été écartées : bash suffit, ffmpeg fait tout le travail, aucune dépendance supplémentaire. - Usage visé : flexible — détection automatique des formats d'images, options CLI simples.
Interface
./stopmotion.sh # ./images → ./stop_motion.mp4, 12 fps, 1080px
./stopmotion.sh -i photos -o film.mp4 -f 15 -s 720 -y
| Option | Défaut | Rôle |
|---|---|---|
-i |
./images |
dossier d'images |
-o |
./stop_motion.mp4 |
fichier de sortie |
-f |
12 |
fps (cadence stop motion) |
-s |
1080 |
taille max du côté long, ratio préservé |
-y |
off | écraser la sortie sans demander |
-h |
— | aide |
Comportement
- Vérifie la présence de
ffmpegdans le PATH ; sinon message clair + exit 1. - Liste les images du dossier d'entrée (extensions
jpg,jpeg,png,heic, insensible à la casse, premier niveau uniquement), triées par nom (LC_ALL=C sort). - Erreur explicite si le dossier n'existe pas ou ne contient aucune image (exit 1).
- Génère un fichier
ffconcattemporaire (mktemp + trap de nettoyage) : en-têteffconcat version 1.0, puis pour chaque imagefile <chemin>+duration 1/fps; dernière image répétée sans durée (contrainte du concat demuxer qui sinon ignore la dernière frame). Les chemins contenant des apostrophes sont échappés ('→'\''). - Encode avec ffmpeg :
-f concat -safe 0,libx264,yuv420p,-movflags +faststart, filtrescale=S:S:force_original_aspect_ratio=decrease:force_divisible_by=2. - Affiche un récapitulatif : nombre d'images, fps, durée de la vidéo, taille du fichier de sortie.
Gestion des erreurs
- Options inconnues ou valeur manquante → usage + exit 1.
- Dossier d'entrée inexistant ou sans image → message en français + exit 1.
- Échec d'encodage ffmpeg → le fichier de sortie est supprimé s'il est partiel, exit 1.
- Sortie existante sans
-y→ demande confirmation (refus = exit 0 sans rien faire). - Codes de sortie non nuls pour toute erreur.
Validation
Rejouer le scénario de référence : ./stopmotion.sh sans option sur ce projet doit produire une vidéo équivalente à l'actuelle stop_motion.mp4 (42 frames, 12 fps, 1080x1080, ~3,5 s). Vérifier aussi : -h, dossier inexistant, dossier sans image, sortie refusée sans -y.