ffmpeg 自动拼接成片 · Auto-assemble with ffmpeg
storyboard.json → 配音(edge-tts)→ 每镜 Ken Burns / 裁切 vidéo → xfade 转场 → ASS 字幕花字 → BGM 闪避混音 → 两遍 loudnorm(-14 LUFS)→ out/video.mp4 + .srt。
Fait partie de ecommerce-video-skills · Les scripts sont tous dans le répertoire
scripts/:assemble.py(programme principal) ·tts_edge.py·make_subs.py·make_bgm.py(synthèse BGM libre de droits) ·make_cards.py(cartes produits/cartes de fin avec PIL)
Entrées Inputs
storyboard.json(peut être généré parselling-point-storyboard), les chemins des médias sont relatifs à ce fichier- Environnement : Python 3.9+,
pip install pillow numpy edge-tts, ffmpeg (avec libass), police CJK
Démarrage rapide Quick start
pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4 # Exemple fourni, environ 30s de rendu
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4 # Aperçu hors ligne (sans voix-off, durée estimée par nombre de caractères)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4 # Vidéo produit 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3 # Utilise une musique dont vous avez les droits
Champs du storyboard Fields
| Champ | Description |
|---|---|
voice / rate / pitch (racine) | Timbre edge-tts, débit (ex. +10%), hauteur tonale |
bgm (racine) | "auto" (synthèse intégrée, libre de droits) / chemin du fichier audio / null |
tag (racine) | Autocollant en haut à gauche pendant toute la vidéo (marque/modèle/« Démo ») |
image ou video (+start) | Média ; pour une vidéo, extrait à partir de start seconde sur la durée du plan |
line | Texte de la voix-off ; durée du plan = voix-off + 0.15s de préfixe + pad |
sub | Sous-titres (par défaut identique à line) ; "" signifie pas de sous-titres pour ce plan ; **mise en gras**, ` |
title / cta | Texte stylisé / bouton d'appel à l'action |
motion | zoom_in zoom_out pan_left pan_right pan_up pan_down punch static |
fit | auto (ajuste selon le ratio : rogne si proche, remplissage flou sinon) / cover / blur |
transition | Nom du xfade pour la transition vers le plan suivant : fade slideleft slideup smoothleft circleopen wipeleft … |
min / duration / pad | Durée minimale / durée fixe / silence après la phrase (secondes) |
Étapes Steps
- Vérifier que tous les médias existent, que leurs dimensions sont appropriées (image produit ≥ 1000px) ; si la carte de fin manque, la générer avec
make_cards.py:python scripts/make_cards.py --image main.png --name "NomProduit" --points "Point1|Point2|Point3" -o assets/end-card.png - Lancer d'abord un aperçu avec
--tts nonepour vérifier le rythme visuel, puis lancer le rendu final. - Après le rendu, extraire une image pour vérification :
ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png - Utiliser
platform-spec-exportpour exporter les versions pour chaque plateforme ; utilisercover-title-abpour la vignette.
Détails du pipeline How it works
- Ken Burns : Animation image par image avec
scale(eval=frame)+crop, moins de tremblements qu'aveczoompan;punch= zoom avant rapide en 0,35 seconde (pour accrocher). - Transitions : Chaque plan est rendu avec une demi-durée supplémentaire pour la transition ; xfade centré sur la frontière entre les plans, le point de départ de la voix-off n'est pas coupé par la transition.
- Mixage : La voix-off est placée au début de chaque plan ; la musique de fond est à -20 dB par défaut, compressée de 10 dB supplémentaires en présence de voix (ducking lissé) ; compression/limitation puis double loudnorm pour atteindre environ -14 LUFS, TP -1,5 dB.
- Sous-titres : Génération d'un
build/timing.jsonbasé sur la durée réelle de la voix-off →make_subs.py→ incrustation avec libass, export simultané du fichier.srt.
Liste de vérification Checklist
- Durée, résolution et fréquence d'images de la vidéo finale correctes (
ffprobe out/video.mp4) - Extraire 3 images : les sous-titres ne cachent pas le produit, ne dépassent pas dans la zone UI du bas
- Écouter : voix-off claire, BGM non envahissant, pas de craquement au début
- La musique de fond possède une licence commerciale (la musique synthétisée
autopeut être utilisée sans crainte) - Les médias (images/vidéos/polices) sont sous licence d'utilisation
Problèmes courants et correctifs Failure fixes
| Problème | Correctif |
|---|---|
ffmpeg failed | Voir la fin du stderr imprimé par le script ; cause fréquente : chemin erroné ou ffmpeg sans libass/libx264 |
| Bords flous | Résolution trop faible ; utiliser une image d'au moins 1080px ou réduire l'amplitude du mouvement (passer à static) |
| Produit rogné | Définir "fit": "blur" pour ce plan |
| Son coupé au niveau de la transition | Cela n'arrive pas (la voix-off est alignée sur le début du plan) ; si une duration personnalisée est trop courte, l'allonger |
| Rendu lent | Le preset utilise déjà des fichiers intermédiaires veryfast ; pour l'encodage final, remplacer -preset medium par fast |
| Besoin de 1:1 / 16:9 | Utiliser --size 1080x1080 / --size 1920x1080, la taille des sous-titres s'ajuste automatiquement |
Références et remerciements : L'idée s'inspire du pipeline « script→voix-off→sous-titres→assemblage » de MoneyPrinterTurbo (MIT), mais cette implémentation est une version indépendante en pur ffmpeg, sans copie de son code.