ffmpeg automatische Videomontage · Auto-assemble with ffmpeg
storyboard.json → Sprachausgabe (edge-tts) → Ken Burns / Video-Zuschnitt pro Einstellung → xfade-Übergänge → ASS-Untertitel/Textoverlays → BGM-Ducking-Mixing → zweifaches loudnorm (-14 LUFS) → out/video.mp4 + .srt.
Teil von ecommerce-video-skills · Skripte befinden sich im Verzeichnis
scripts/:assemble.py(Hauptprogramm) ·tts_edge.py·make_subs.py·make_bgm.py(lizenzfreie BGM-Synthese) ·make_cards.py(PIL-Produktkarten/Endkarten)
Eingaben Inputs
storyboard.json(kann vonselling-point-storyboardgeneriert werden), Medienpfade relativ zu dieser Datei- Umgebung: Python 3.9+,
pip install pillow numpy edge-tts, ffmpeg (mit libass), CJK-Schriftarten
Schnellstart Quick start
pip install pillow numpy edge-tts
python scripts/assemble.py examples/aura-bottle/storyboard.json -o out/aura.mp4 # Mitgeliefertes Beispiel, Rendering in ca. 30 Sekunden
python scripts/assemble.py storyboard.json --tts none -o out/preview.mp4 # Offline-Vorschau (ohne Sprachausgabe, Schätzung nach Zeichenzahl)
python scripts/assemble.py storyboard.json --size 1080x1080 -o out/main-1x1.mp4 # Produktvideo 1:1
python scripts/assemble.py storyboard.json --bgm music.mp3 # Mit Ihrer lizenzierten Musik
storyboard-Felder Fields
| Feld | Beschreibung |
|---|---|
Oberste Ebene voice / rate / pitch | edge-tts Stimme, Sprechgeschwindigkeit (z.B. +10%), Tonhöhe |
Oberste Ebene bgm | "auto" (eingebaute Synthese, lizenzfrei) / Musikdateipfad / null |
Oberste Ebene tag | Aufkleber oben links während des gesamten Videos (Marke/Modell/"Demo") |
image oder video (+start) | Medien; Video wird ab Sekunde start für die Dauer dieser Einstellung ausgeschnitten |
line | Sprachtext; Einstellungslänge = Sprachdauer + 0,15 s Vorlauf + pad |
sub | Untertitel (standardmäßig gleich line); "" bedeutet keine Untertitel für diese Einstellung; **Hervorhebung**, ` |
title / cta | Textoverlay / Call-to-Action-Button |
motion | zoom_in zoom_out pan_left pan_right pan_up pan_down punch static |
fit | auto (bei ähnlichem Seitenverhältnis Zuschnitt, sonst unscharfe Füllung) / cover / blur |
transition | xfade-Name für den Übergang zur nächsten Einstellung: fade slideleft slideup smoothleft circleopen wipeleft … |
min / duration / pad | Mindestdauer / feste Dauer / Nachlaufpause (Sekunden) |
Schritte Steps
- Prüfen, ob alle Medien vorhanden sind und das Seitenverhältnis stimmt (Produktbilder ≥ 1000px); fehlt eine Endkarte, wird sie mit
make_cards.pyerstellt:python scripts/make_cards.py --image main.png --name "Produktname" --points "Vorteil1|Vorteil2|Vorteil3" -o assets/end-card.png - Zuerst mit
--tts nonedurchlaufen lassen, um den Bildrhythmus zu prüfen, dann endgültig rendern. - Nach dem Rendern einen Frame zur Kontrolle extrahieren:
ffmpeg -ss 3 -i out/video.mp4 -frames:v 1 check.png - An
platform-spec-exportzur Ausgabe für verschiedene Plattformen übergeben;cover-title-abfür das Cover verwenden.
Pipeline-Details How it works
- Ken Burns: Pro Frame
scale(eval=frame)+crop, weniger ruckelig alszoompan;punch= 0,35 Sekunden schneller Zoom (für Hook-Effekte). - Übergänge: Jede Einstellung wird um eine halbe Übergangslänge länger gerendert, xfade zentriert auf dem Schnittpunkt, Sprachbeginn wird nicht vom Übergang abgeschnitten.
- Mixing: Sprachausgabe wird an den Einstellungsanfängen platziert; BGM standardmäßig bei -20 dB, bei Sprachaktivität um weitere 10 dB reduziert (sanftes Ducking); zuerst Kompression/Limiting, dann zweifaches loudnorm auf ca. -14 LUFS, TP -1,5 dB.
- Untertitel: Mit tatsächlicher Sprachdauer wird
build/timing.jsonerstellt →make_subs.py→ libass zum Einbrennen, gleichzeitig Export als.srt.
Checkliste Checklist
- Endvideo-Länge, Auflösung, Bildrate korrekt (
ffprobe out/video.mp4) - 3 Frames prüfen: Untertitel überdecken kein Produkt, dringen nicht in den unteren UI-Bereich ein
- Anhören: Sprachausgabe klar, BGM nicht aufdringlich, kein Knacksen zu Beginn
- BGM hat kommerzielle Lizenz (
auto-Synthesemusik kann bedenkenlos verwendet werden) - Medien (Bilder/Videos/Schriftarten) haben Nutzungslizenz
Häufige Probleme und Fehlerbehebung Failure fixes
| Problem | Behebung |
|---|---|
ffmpeg failed | Letzte Zeile des von Skript ausgegebenen stderr prüfen; meist Pfadfehler oder fehlendes libass/libx264 in ffmpeg |
| Bildränder unscharf | Medienauflösung zu niedrig; Bild ≥1080px verwenden oder Bewegungsintensität verringern (auf static setzen) |
| Produkt wird abgeschnitten | "fit": "blur" für diese Einstellung setzen |
| Ton am Übergang abgeschnitten | Tritt nicht auf (Sprachausgabe beginnt am Einstellungsanfang); falls eigene duration zu kurz, verlängern |
| Rendering langsam | Voreinstellung verwendet bereits veryfast für Zwischendateien; Endcodierung kann -preset medium auf fast ändern |
| 1:1 / 16:9 gewünscht | --size 1080x1080 / --size 1920x1080, Schriftgröße wird automatisch angepasst |
Referenzen und Danksagung: Inspiriert von der Pipeline MoneyPrinterTurbo (MIT) "Skript → Sprachausgabe → Untertitel → Montage", diese Implementierung ist eine eigenständige, reine ffmpeg-Version ohne Kopie seines Codes.