docs: arbitrage e4 (sans répétition, -r FPS) dans spec et plan
This commit is contained in:
2 files changed
+5
-6
No files matched your search
@@ -4,7 +4,7 @@
|
||||
|
||||
**Goal :** un script bash `stopmotion.sh` qui génère une vidéo stop motion MP4 (H.264) à partir d'un dossier d'images (jpg/jpeg/png/heic), avec options CLI.
|
||||
|
||||
**Architecture :** un seul fichier `stopmotion.sh` à la racine. Découverte des images via `find` trié → fichier `ffconcat` temporaire (une entrée `duration` par image, dernière image répétée — contournement du concat demuxer qui ignore sinon la dernière frame) → encodage ffmpeg (libx264, yuv420p, +faststart). Le fichier ffconcat est créé dans le dossier du fichier de sortie (les chemins d'images y sont absolus, le concat demuxer résout les chemins relativement à l'emplacement de la liste).
|
||||
**Architecture :** un seul fichier `stopmotion.sh` à la racine. Découverte des images via `find` trié → fichier `ffconcat` temporaire (une entrée `duration` par image) → encodage ffmpeg (libx264, yuv420p, +faststart, `-r FPS` en sortie pour une cadence CFR qui garantit la durée complète de la dernière frame). Le fichier ffconcat est créé dans le dossier du fichier de sortie (les chemins d'images y sont absolus, le concat demuxer résout les chemins relativement à l'emplacement de la liste). (Amendement 2026-08-31, arbitrage utilisateur : la répétition de la dernière image prévue initialement créait une 43e frame dupliquée avec la timebase 1/25 des HEIC — variante e4 validée par framehash.)
|
||||
|
||||
**Tech Stack :** bash 3.2 (bash système de macOS — pas de tableaux associatifs, pas de `${var,,}`), ffmpeg 8.x (Homebrew, décode le HEIC), `find` BSD.
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- Aucun commentaire dans le code.
|
||||
- Compatible bash 3.2 (macOS) : pas de fonctionnalités bash 4+.
|
||||
- Fonctionnement vérifié avec le build ffmpeg 8.1.2 Homebrew (`-pattern_type glob` non supporté → concat demuxer obligatoire).
|
||||
- Encodage : `-c:v libx264 -pix_fmt yuv420p -movflags +faststart`, filtre `scale=S:S:force_original_aspect_ratio=decrease:force_divisible_by=2`.
|
||||
- Encodage : `-c:v libx264 -pix_fmt yuv420p -movflags +faststart`, `-r "$FPS"` en sortie, filtre `scale=S:S:force_original_aspect_ratio=decrease:force_divisible_by=2`.
|
||||
- Validation stricte avant tout traitement : `-f` et `-s` numériques strictement positifs.
|
||||
- Scénario de référence (validation finale) : `./images` (42 HEIC 3056x3056) sans option → 42 frames, 12 fps, 1080x1080, ~3,5 s.
|
||||
|
||||
@@ -210,13 +210,12 @@ DURATION=$(awk -v f="$FPS" 'BEGIN{printf "%.6f", 1/f}')
|
||||
quote_ffconcat "$img"
|
||||
printf 'duration %s\n' "$DURATION"
|
||||
done <<< "$IMAGES"
|
||||
last=$(printf '%s\n' "$IMAGES" | tail -n 1)
|
||||
quote_ffconcat "$last"
|
||||
} > "$LIST_FILE"
|
||||
|
||||
if ! ffmpeg -y -hide_banner -loglevel error -stats \
|
||||
-f concat -safe 0 -i "$LIST_FILE" \
|
||||
-vf "scale=${SIZE}:${SIZE}:force_original_aspect_ratio=decrease:force_divisible_by=2" \
|
||||
-r "$FPS" \
|
||||
-c:v libx264 -pix_fmt yuv420p -movflags +faststart \
|
||||
"$OUT_DIR/$OUT_NAME"; then
|
||||
rm -f "$OUT_DIR/$OUT_NAME"
|
||||
|
||||
Reference in new issue
Block a user