| import moviepy.editor as mp |
| import moviepy.video.fx.all as vfx |
| import os |
| import imageio |
|
|
|
|
| def mask_png(frames): |
| for frame in frames: |
| im = imageio.imread(frame) |
| im[im[:, :, 3] < 1, :] = 255 |
| imageio.imwrite(frame, im[:, :, 0:3]) |
| return |
|
|
|
|
| class Video: |
| def __init__(self, frame_path: str, fps: float = 12.5, res="high"): |
| frame_path = str(frame_path) |
| self.fps = fps |
|
|
| self._conf = {"codec": "libx264", |
| "fps": self.fps, |
| "audio_codec": "aac", |
| "temp_audiofile": "temp-audio.m4a", |
| "remove_temp": True} |
|
|
| if res == "low": |
| bitrate = "500k" |
| else: |
| bitrate = "5000k" |
|
|
| self._conf = {"bitrate": bitrate, |
| "fps": self.fps} |
|
|
| |
| |
| |
| frames = [os.path.join(frame_path, x) |
| for x in sorted(os.listdir(frame_path))] |
|
|
| |
| mask_png(frames) |
|
|
| video = mp.ImageSequenceClip(frames, fps=fps) |
| self.video = video |
| self.duration = video.duration |
|
|
| def add_text(self, text): |
| |
| video_text = mp.TextClip(text, |
| font='Amiri', |
| color='white', |
| method='caption', |
| align="center", |
| size=(self.video.w, None), |
| fontsize=30) |
| video_text = video_text.on_color(size=(self.video.w, video_text.h + 5), |
| color=(0, 0, 0), |
| col_opacity=0.6) |
| |
| video_text = video_text.set_pos('top') |
|
|
| self.video = mp.CompositeVideoClip([self.video, video_text]) |
|
|
| def save(self, out_path): |
| out_path = str(out_path) |
| self.video.subclip(0, self.duration).write_videofile( |
| out_path, **self._conf) |
|
|