Was macht moviepy (Python-Videokomposition)?
Am besten geeignet für kurze, skriptgesteuerte Videos und das Platzieren von exaktem Text auf Filmmaterial. Für lange, designintensive, wiederverwendbare Videos bevorzugen Sie Remotion.
| Verwenden Sie moviepy, wenn | Verwenden Sie Remotion, wenn |
|---|---|
| Das Projekt ist ein einzelnes Python-Skript | Sie React-Komponenten und ein Designsystem benötigen |
| Text auf vorhandenen oder KI-generierten Clips einblenden | Komplexe animierte Grafiken und Diagramme benötigen |
| Batch-Bearbeitungen über viele Dateien hinweg | Eine Hot-Reload-Vorschau wichtig ist |
| Keine Node-Toolchain verfügbar ist | Langformatige, vorlagenbasierte Videos benötigen |
Einrichtung
pip install "moviepy>=2" pillow
# oder: uv add moviepy pillow
Diese Fähigkeit zielt auf moviepy 2.x ab. Seine API unterscheidet sich von 1.x: Importe kommen direkt aus moviepy, und Methoden sind with_*/subclipped/resized, nicht set_*/subclip/resize.
Grundlagen
from moviepy import (VideoFileClip, AudioFileClip, ImageClip, TextClip,
CompositeVideoClip, CompositeAudioClip, concatenate_videoclips, vfx, afx)
clip = VideoFileClip("in.mp4").subclipped(5, 20) # 15 s Ausschnitt
clip = clip.resized(height=1080) # Seitenverhältnis beibehalten
clip = clip.with_effects([vfx.FadeIn(0.5), vfx.FadeOut(0.5)])
joined = concatenate_videoclips([clip, VideoFileClip("b.mp4")], method="compose")
joined.write_videofile("out/result.mp4", fps=30, codec="libx264", audio_codec="aac")
Rufen Sie immer .close() bei Clips in langen Skripten auf oder verwenden Sie sie in einem with-Block, um Dateihandles freizugeben.
Texteinblendung (deterministischer Text auf Filmmaterial)
titel = (TextClip(font="C:/Windows/Fonts/arial.ttf", # ein echter Schriftartdateipfad
text="Dr. Jane Doe
Chefwissenschaftlerin",
font_size=56, color="white",
stroke_color="black", stroke_width=2,
method="caption", size=(900, None))
.with_start(1.0).with_duration(4.0)
.with_position(("left", 860))
.with_effects([vfx.CrossFadeIn(0.3), vfx.CrossFadeOut(0.3)]))
final = CompositeVideoClip([clip, titel])
Hinweise:
TextClipbenötigt einen Schriftartdateipfad (TTF/OTF). Liefern Sie die Markenschriftart im Projekt mit.- Clip-Zeiten sind in Sekunden, relativ zum Start der Komposition.
- Für stark gestalteten Text (abgerundete Pillen, Verläufe) rendern Sie ein PNG mit Pillow und verwenden Sie
ImageClip. - Halten Sie Text innerhalb des sicheren Bereichs: mindestens 5% von jeder Kante.
Audio
voice = AudioFileClip("voiceover.mp3")
music = AudioFileClip("music.mp3").with_effects([afx.MultiplyVolume(0.12), afx.AudioFadeOut(2)])
music = music.with_duration(voice.duration + 1)
final = clip.with_audio(CompositeAudioClip([music, voice.with_start(0.5)]))
Lassen Sie das Voiceover die Zeitleiste bestimmen: Setzen Sie die Clip-Dauer auf voice.duration + padding, nicht umgekehrt.
Audio-verankertes Muster
szenen = [("szene1.mp3", "intro.png"), ("szene2.mp3", "diagramm.png")]
teile = []
for audio_path, image_path in szenen:
a = AudioFileClip(audio_path)
v = ImageClip(image_path).with_duration(a.duration + 0.6).with_audio(a)
teile.append(v)
concatenate_videoclips(teile).write_videofile("out/erklaervideo.mp4", fps=30)
Ken Burns auf Standbildern
img = ImageClip("photo.jpg").with_duration(6)
img = img.resized(lambda t: 1.0 + 0.04 * t).with_position("center")
CompositeVideoClip([img], size=(1920, 1080)).write_videofile("out/kb.mp4", fps=30)
Leistung
- Vorschau mit
fps=12undpreset="ultrafast"; endgültige Version mit 30 fps rendern. write_videofile(..., threads=4).- Vermeiden Sie Python-Lambdas pro Frame bei langen Clips. Verwenden Sie nach Möglichkeit FFmpeg für die Vorverarbeitung.
Fallstricke
| Problem | Ursache und Lösung |
|---|---|
ImportError: cannot import name 'editor' | moviepy 2 hat moviepy.editor entfernt; importieren Sie von moviepy |
AttributeError: set_duration | Verwenden Sie with_duration; gilt auch für with_start, with_position |
| Textclip stürzt ab | Übergeben Sie einen echten Schriftartdateipfad |
| Audio nach dem Zusammenfügen asynchron | Stellen Sie sicher, dass alle Clips die gleiche fps haben; Audio nach der Verkettung anwenden |
| Langsames Rendern | Niedrigere Auflösung für Entwürfe; große resized-Lambdas vermeiden |