Contexte
Un clip de 6 min 36 (396 s) à monter à partir de rushes de 9 s générés par IA (832 × 464), calé sur les temps forts du morceau — les logiciels de montage du commerce ne connaissent pas les beats.
Ce que j'ai construit
- Carte du rythme calculée depuis l'audio (numpy) : beats et temps forts détectés pour aimanter les coupes.
- Timeline avec forme d'onde et beats, coupes aimantées au beat, glisser-déposer des plans, undo/redo.
- 18 transitions (fondus enchaînés type xfade) et une piste d'effets minutés — flou, glitch, noir et blanc, tremblement, zoom, vignette.
- Aperçu WebGL en temps réel (deux textures vidéo, un shader unique) qui reproduit l'étalonnage, les effets et les transitions du rendu ffmpeg, sans jamais rendre pour prévisualiser.
- Trimmer de rushes avec rescan incrémental du catalogue, pour ajouter des plans sans tout redécrire.
- Catalogue de 470 rushes vignettés, dont 243 décrits par douze agents en parallèle (type, cadre, mouvement, qualité, plans compatibles).
- Un projet en JSON édité à deux mains : Jonathan cale à l'oreille, l'assistant renseigne les données.
- 9 blocs narratifs et 84 plans au total, organisés dans un navigateur de rushes par dossier.
Preuves
- 13 scripts Python et un serveur en bibliothèque standard (port local), aucune dépendance lourde hors ffmpeg.
- Le clip entier (6 min 36) a été rendu et assemblé avec cet outil.
- Aucune suite de tests automatisés : outil personnel vérifié à l'œil et à l'oreille, dit tel quel.
Un incident réel, et comment je l'ai réglé
Les effets étaient ignorés au rendu
- Constat
- L'aperçu WebGL montrait les effets appliqués sur chaque plan, mais le mp4 rendu par ffmpeg ne les avait pas : le résultat final paraissait plat.
- Cause
- La conversion du projet JSON vers le manifeste de rendu ne recopiait pas le champ `fx` avec ses fenêtres de temps ; l'aperçu et le rendu lisaient deux structures différentes.
- Correctif
- Correctif d'une ligne pour recopier le champ manquant, et une règle retenue : l'aperçu et le rendu lisent désormais la même structure, jamais deux copies.
Stack
Python · ffmpeg · WebGL · Web Audio · numpy