| 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 | |