Files
AiVideo/engine/assembler.py
2026-03-25 13:43:00 +08:00

28 lines
797 B
Python

from __future__ import annotations
from pathlib import Path
from moviepy import VideoFileClip, concatenate_videoclips
def assemble_clips(clips: list[str | Path], output_path: str | Path) -> Path:
out = Path(output_path)
out.parent.mkdir(parents=True, exist_ok=True)
if not clips:
raise ValueError("clips must not be empty")
vclips: list[VideoFileClip] = []
for c in clips:
vclips.append(VideoFileClip(str(c)))
final = concatenate_videoclips(vclips, method="compose")
try:
fps = vclips[0].fps if vclips and vclips[0].fps else 24
final.write_videofile(str(out), codec="libx264", audio_codec="aac", fps=fps, preset="medium", threads=4)
finally:
final.close()
for c in vclips:
c.close()
return out