Montage vidéo avec ffmpeg
Vous êtes un monteur qui travaille avec une transcription et des graphes de filtres, plutôt qu'avec une souris et un timeline. Le pipeline est déterministe : tout est édité en texte et reconstruit avec une seule commande.
rushes → transcription avec timings mot par mot → EDL (liste de montage) → ffmpeg → vidéo terminée
↑ ↑
faster-whisper éditée à la main — c'est ici que se fait le montage
Principe fondamental : la vidéo n'est jamais analysée pixel par pixel — le montage est piloté par le texte horodaté. La parole définit la structure ; l'image la sert.
Un seul rouleau ou plusieurs ?
Décidez cela en premier — cela change tout en aval.
- Un ou deux rouleaux → suivez l'ordre des étapes ci-dessous, de manière conversationnelle.
- Trois rouleaux ou plus → passez au pipeline par lots : references/batch-pipeline.md. Chaque étape s'exécute une fois sur l'ensemble du projet et utilise un cache basé sur le hachage d'entrée. Faire dix rouleaux de manière conversationnelle coûte environ dix fois plus de contexte sans aucun avantage.
Ordre du travail
Suivez toujours les étapes, ne sautez jamais d'étape. Chaque étape produit l'entrée de la suivante.
- Vérifiez l'environnement. Si ffmpeg / faster-whisper / Chrome sont manquants → references/setup.md. Sur une machine vierge, cela prend dix minutes.
- Obtenez la source. Si l'utilisateur vous a donné une URL au lieu d'un fichier, récupérez-la d'abord avec
download.py. - Inspectez la source — ffprobe, détection de scène, une planche contact. Regardez les images de vos propres yeux via Read. Ne montez jamais à l'aveugle à partir du seul texte.
- Transcrivez avec des timings mot par mot et relisez le résultat. La reconnaissance vocale fait des erreurs de mots même sur un audio propre. Pas de modèle local ?
transcribe_cloud.pyobtient le même résultat à partir de Groq/OpenAI. - Convenez du concept avec l'utilisateur s'il n'en a pas spécifié un : format, ce qui va dans les graphiques, plateforme cible. Une question, pas un questionnaire.
- Construisez l'EDL — coupez les silences, ne coupez jamais les idées.
- Construisez
base, puis vérifiez les coupes image par image. - Générez les sous-titres et les incrustations, construisez
final. - Exécutez la checklist d'acceptation et livrez le fichier avec SendUserFile.
Commandes complètes pour chaque étape — references/pipeline.md.
Ce que ce pipeline peut et ne peut pas faire
Peut : coupe sémantique, suppression des silences, punch-in sur les coupes, étalonnage (y compris les LUT .cube), sous-titres mot par mot, infographies arbitrairement complexes via HTML/CSS, stabilisation, normalisation du volume pour les plateformes sociales, traitement par lots. Avec le plugin Remotion installé, également des graphiques animés rendus à partir de React — voir references/remotion.md.
Ne peut absolument pas — dites-le clairement si l'utilisateur le demande : suivi d'objet (épingler un sous-titre à une main en mouvement) et masque d'étalonnage. Ceux-ci nécessitent encore Premiere / DaVinci / After Effects.
Ne peut pas seul, mais peut avec FableCut installé : coupe créative image par image, animation d'images clés, transitions, rampes de vitesse, incrustation chroma key, coupe au rythme de la musique. FableCut est un timeline de navigateur qu'un agent pilote via MCP — voir references/fablecut.md. Il n'a pas de reconnaissance vocale et son exportation nécessite un clic humain, donc la structure pilotée par la parole et les lots sans surveillance restent dans ce pipeline.
Outils prêts à l'emploi
assets/tools/ contient douze scripts fonctionnels — copiez-les dans le projet, ne les réécrivez pas de zéro :
| Script | Ce qu'il fait |
|---|---|
download.py | récupère les rushes source à partir d'une URL (yt-dlp) — ignorez si vous avez déjà un fichier local |
transcribe.py | faster-whisper → transcript.json avec timings mot par mot + .srt |
transcribe_cloud.py | même sortie, via l'API Groq/OpenAI Whisper — pas de téléchargement de modèle, nécessite une clé API |
pauses.py | liste les pauses dans la parole — la base de l'EDL |
dump_words.py | chaque mot avec son index et sa confiance — pour la relecture |
make_ass.py | sous-titres ASS mot par mot, resynchronisés sur le timeline post-coupe |
render_overlays.py | HTML/CSS → Chrome headless → PNG 1080×1920 avec alpha |
build.py | assemblage : base (coupe + étalonnage), final (incrustations + sous-titres + audio) |
build_vo.py | idem, mais pour une piste de voix-off séparée — vidéo de plusieurs sources adaptée à l'audio |
batch_vo.py | transcrire chaque voix-off en un seul chargement de modèle |
mute_subs.py | supprime les sous-titres lorsqu'une carte plein écran est à l'écran |
pipeline.py | pilote par lots — chaque étape pour chaque rouleau, avec mise en cache |
assets/templates/ contient des squelettes edl.json, overlays.json et corrections.json.
Organisez le projet comme ceci :
<dossier contenant les rushes>/
├── IMG_XXXX.MOV
└── edit/
├── tools/ ← les scripts copiés
├── work/ ← fichiers intermédiaires, jamais livrés
├── overlays/ ← PNG rendus
├── out/ ← vidéos terminées
├── edl.json overlays.json corrections.json subs.ass
Fichiers de référence
Chargez-les à la demande, pas tous à la fois :
- references/setup.md — installation sur une machine vierge (Windows/macOS), vérification de la compilation ffmpeg
- references/pipeline.md — le flux de travail étape par étape, règles de coupe, commandes
- references/storyboard.md — formats vidéo, types de panneaux, comment storyboarder une tête parlante
- references/design-system.md — palette, échelle typographique, zones de sécurité, techniques d'incrustation
- references/batch-pipeline.md — exécuter plusieurs rouleaux en tant qu'étapes, et où va réellement le contexte
- references/remotion.md — niveau des graphiques animés : quand les incrustations rendues par React valent leur coût
- references/fablecut.md — niveau du timeline : quand confier le montage à FableCut, et comment les deux pipelines se rencontrent
- references/ffmpeg-cookbook.md — étalonnages, effets, transitions, audio, encodage
- references/troubleshooting.md — lisez ceci avant votre première exécution ffmpeg ; dix-sept défaillances, chacune ayant coûté une heure
Règles qui font ou défont la vidéo
Apprises sur de véritables réalisations, pas dans la documentation.
- Regardez les images. Une transcription ne vous dira pas que le locuteur se lève ou se recoiffe à cet instant précis. Ce sont précisément les endroits où les coupes échouent.
- Une carte va au-dessus du visage, jamais dessus. La première tentative place toujours le panneau au milieu du cadre, couvrant les yeux. Le regard du locuteur est la moitié de la confiance que la vidéo gagne.
- Coupez à la fin d'une phrase, pas sur un chronomètre. Couper "toutes les N secondes" coupe les idées en deux.
- Laissez 0,2 à 0,3 s de chaque silence. Un silence réduit à zéro sonne comme un bégaiement.
- Ne touchez jamais aux silences dramatiques — après une question, avant une conclusion. Là, le silence fait le travail.
- Alternez le
zoomentre les segments. Ainsi, une coupe est perçue comme un changement d'angle plutôt qu'une erreur. - Laissez un passage sans aucun graphisme. Le spectateur a besoin d'air ; un mur solide de cartes est épuisant.
- Relisez les sous-titres. Une erreur de reconnaissance gravée dans l'image est permanente.
- Vérifiez en regardant, pas par foi. Extrayez des images fixes, empilez-les avec
hstack, ouvrez le résultat via Read. - Ne livrez jamais sans la checklist d'acceptation dans pipeline.md.
- Ne laissez jamais un outil réécrire dans un fichier de configuration. Un script qui ajoute sa propre sortie à l'EDL double la taille de ce fichier, et chaque modification ultérieure fait écho au tout dans le contexte. Les données générées appartiennent au dossier
work/. - Lisez vous-même la première et la dernière ligne de la transcription. Whisper hallucine des textes fabriqués sur le silence — classiquement une fausse ligne de crédit de sous-titreur sur un audio russe — et cela peut porter un score de confiance parfaitement normal. Les deux scripts de transcription filtrent les cas évidents automatiquement, mais le filtre n'est pas étanche. Voir troubleshooting.md #17.
Orchestration
La tâche est en plusieurs étapes — créez des tâches avec TaskCreate pour les phases (transcription, EDL, étalonnage, graphismes, assemblage) et maintenez leur statut à jour. Lancez les opérations longues (téléchargement du modèle, rendu de base) en arrière-plan et utilisez ce temps pour un travail qui n'en dépend pas : pendant que le modèle se télécharge, concevez les incrustations et testez les étalonnages sur des images fixes.
Livrez la vidéo terminée avec SendUserFile et une courte note sur ce qui a changé.