28 lines
797 B
Python
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
|
|
|