from moviepy.editor import VideoFileClip, VideoClip, ImageClip, CompositeVideoClip, ImageSequenceClip from moviepy.editor import VideoFileClip, clips_array import os import argparse def write_video(vclip, fps=25, save_path='res.mp4'): if isinstance(vclip, list): vclip = ImageSequenceClip(vclip, fps=fps) vclip.write_videofile(save_path, codec="libx264") def load_video(vpath): return VideoFileClip(vpath) def concat_video_clips(clips, videos_per_row=3): if isinstance(clips[0], str): clips = [VideoFileClip(v) for v in clips] elif not isinstance(clips[0], VideoFileClip): print(f'Find {len(clips)} clips') min_duration = min(clip.duration for clip in clips) clips = [clip.subclip(0, min_duration) for clip in clips] rows = [clips[i:i + videos_per_row] for i in range(0, len(clips), videos_per_row)] final_clip = clips_array(rows) return final_clip def concat_video_and_frames(vpath, frames): vclip1 = VideoClip(vpath) vclip2 = ImageSequenceClip(frames, fps=25) clips = concat_video_clips([vclip1, vclip2]) return clips def concat_img_video(vclip, img): if isinstance(vclip, str): vclip = VideoFileClip(vclip) image_clip = ImageClip(img).set_duration(vclip.duration) image_clip = image_clip.resize(height=vclip.size[1]) total_width = vclip.size[0] + image_clip.size[0] total_height = max(vclip.size[1], image_clip.size[1]) composite_clip = CompositeVideoClip([ image_clip.set_position('left'), vclip.set_position((image_clip.size[0], 0)), ], size=(total_width, total_height)) return composite_clip