MoviePy write_videofile ist extrem langsam
Posted: 27 Dec 2024, 14:03
Also verwende ich die Funktion concatenate_videoclips von MoviePy, um zwei Videoclips zu kombinieren, auf denen jeweils ein Bild und etwas Text überlagert sind. Wenn ich die Videodatei schreibe, dauert es etwa GANZE 2 Minuten, bis sie fertig ist. Wenn ich es mit etwa 100 Clips mit denselben Informationen (ein Bild und etwas überlagerter Text) skaliere, dauert es für ein nur 15-minütiges Video etwa 4 Stunden. Ich frage mich, ob es eine Möglichkeit gibt, dieses Problem abzumildern. Ist MoviePy für so etwas nicht geeignet?
Mein Beispiel ist dieses, das mit etwa 4 it/s läuft, wobei beide Videos eine Auflösung von 1920 x 1080 haben und beide 10 Sekunden lang sind:
Die Spezifikationen meines PCs sind:
Sie scheinen für einen Job wie diesen mehr als ausreichend zu sein. Es scheint auch, dass MoviePy meine GPU nicht nutzt und die gesamte Videokodierung auf die CPU überträgt.
Ich verwende so viele ffmpeg-Funktionen von MoviePy wie möglich, um die Dinge zu beschleunigen, außer der Funktion write_videofile ist immer noch sehr langsam. Ich habe alle Optimierungen ausprobiert, die ich finden konnte, aber keine hat einen Unterschied gemacht. Mit einigen von ihnen kann ich die Iteration pro Sekunde um einen erheblichen Betrag steigern, aber nach ein paar Sekunden der Verarbeitung fällt diese Zahl steil ab und geht zurück auf 3-5it/s. Einige der Optimierungen, die ich ausprobiert habe, sind:
Mein Beispiel ist dieses, das mit etwa 4 it/s läuft, wobei beide Videos eine Auflösung von 1920 x 1080 haben und beide 10 Sekunden lang sind:
Code: Select all
from moviepy.editor import *
from moviepy.config import change_settings
change_settings({"IMAGEMAGICK_BINARY": "D:\\ImageMagick-7.1.1-Q16-HDRI\\magick.exe"})
def create(vid_path: str) -> CompositeVideoClip:
vid: VideoFileClip = VideoFileClip(vid_path)
vid = vid.crossfadein(0.8)
vid = vid.crossfadeout(0.8)
name_square: ImageClip = ImageClip(".\\square.png")
name_square = name_square.set_position(('center', 856))
name_square = name_square.set_duration(vid.duration)
name_square = name_square.crossfadein(1)
name_square = name_square.crossfadeout(1)
name_text: TextClip = TextClip(txt="Hello", fontsize=90, color="gray", font="MomCake")
name_text = name_text.set_position(("center", 870))
name_text = name_text.set_duration(vid.duration)
name_text = name_text.crossfadein(1)
name_text = name_text.crossfadeout(1)
comp_clip: CompositeVideoClip = CompositeVideoClip([vid, name_text])
return comp_clip
final: VideoFileClip = concatenate_videoclips([create("vid1.mp4"), create("vid2.mp4")])
final.write_videofile(f"final_vid.mp4", threads=12, preset="ultrafast", ffmpeg_params=['-b:v','10000k'])
Code: Select all
Intel i7-9700K
Code: Select all
32GB of memory
Code: Select all
NVIDIA GeForce RTX 2060
Ich verwende so viele ffmpeg-Funktionen von MoviePy wie möglich, um die Dinge zu beschleunigen, außer der Funktion write_videofile ist immer noch sehr langsam. Ich habe alle Optimierungen ausprobiert, die ich finden konnte, aber keine hat einen Unterschied gemacht. Mit einigen von ihnen kann ich die Iteration pro Sekunde um einen erheblichen Betrag steigern, aber nach ein paar Sekunden der Verarbeitung fällt diese Zahl steil ab und geht zurück auf 3-5it/s. Einige der Optimierungen, die ich ausprobiert habe, sind:
Code: Select all
threads=12
Code: Select all
preset="ultrafast"
Code: Select all
audio=False
Code: Select all
logger=False
Code: Select all
ffmpeg_params=['-b:v','10000k']