def add_music( self ): #Creates a new video file from the temporary output file and adds the selected audio the the background. my_clip = VideoFileClip("".join(self.save_path.split(".")[:-1]) + "_tmp.avi") music = AudioFileClip(self.mus_path) if my_clip.duration > music.duration: duration = music.duration else: duration = my_clip.duration my_clip = my_clip.set_audio(music.set_duration(duration)) my_clip.write_videofile(self.save_path, fps=self.fps)
def add_sfx(self, clip): logger.info('Adding sfx...') new_audio = [clip.audio] for i in range(self.sfx_num): sfx_path = config.SFX_PATH + str(i) + '.mp3' sfx_clip = AudioFileClip(sfx_path) if sfx_clip.duration > clip.duration: sfx_clip = sfx_clip.set_duration(clip.duration) new_audio.append(sfx_clip) else: new_audio.append(sfx_clip) return clip.set_audio(CompositeAudioClip(new_audio))
def _compile_worker(session_key: str, video_id: str) -> None: # Use this for conditional creation config = get_nosql_handler().get_video_config(video_id) session_clips = get_sql_handler().get_session_clips_by_session_key(session_key) for session_clip in session_clips: download_session_clip(session_clip, sync=True) session_audios = get_sql_handler().get_session_audio_by_session_key(session_key) session_audio = None if session_audios: session_audio = session_audios[0] download_session_audio(session_audio, sync=True) # Create VideoFileClips clips = [VideoFileClip(session_clip.local_file_path()) for session_clip in session_clips] total_duration = sum([clip.duration for clip in clips]) # Make all clips the same size final_w = min([clip.w for clip in clips]) final_h = min([clip.h for clip in clips]) clips = [resize(clip, newsize=(final_w, final_h)) for clip in clips] # Adding gamertag and logo to the video # gamertag = config.get('gamertag', '') # gamertag_position = config.get('gamertag_position', ['right', 'bottom']) # # if gamertag != '': # gamertag_clip = TextClip(txt='@'+gamertag, fontsize=50, font = 'Comfortaa', color='white') # gamertag_clip = gamertag_clip.set_duration(final.duration)\ # .margin(right=8,top = 8, left=8, bottom=8, opacity=0)\ # .set_position((gamertag_position[0], gamertag_position[1]) # === WATERMARK === logo_position = config.get('logo_position', ['left', 'top']) logo_clip = ImageClip('./reels/static/reels/reels-logo-white.png') logo_clip = resize(logo_clip, height=final_h / 5) try: logo_x = (0 if logo_position[0] == 'left' else final_w - logo_clip.w) logo_y = (0 if logo_position[1] == 'top' else final_h - logo_clip.h) except (KeyError, TypeError): logo_x, logo_y = 0, final_h - logo_clip.h logo_clip = logo_clip.set_pos((logo_x, logo_y)) clips = [CompositeVideoClip([clip, logo_clip.set_duration(clip.duration)]) for clip in clips] # Concatenate clips final = concatenate_videoclips(clips, method="compose") # Add audio, only if there is audio audio_clip = None if session_audio: audio_clip = AudioFileClip(session_audio.local_file_path()) audio_clip = audio_clip \ .set_start(config.get('audio_start', 0)) \ .set_end(config.get('audio_end', audio_clip.duration)) # Attach audio to video, but make it only as long as the videos are # TODO: Manage case where videos are longer than audio clip final = final.set_audio(audio_clip.set_duration(final.duration)) # If extra editing is enabled, do so if config.get('extras', False) and session_audio and get_file_type(session_audio.local_file_path()) == 'wav': fs, data = read(session_audio.local_file_path()) data = data[:, 0] data = data[:len(data) - len(data) % 48000] data2 = np.mean(data.reshape(-1, int(48000 / 4)), axis=1) x = np.diff(data2, n=1) secs = np.where(x > 200)[0] t = list(secs[np.where(np.diff(secs) > 12)[0] + 1]) if np.diff(secs)[0] > 12: t.insert(0, secs[0]) for i in range(0, len(t)): t[i] /= 4 for i in t: tfreeze = i if tfreeze + 1.75 >= final.duration: break clip_before = final.subclip(t_end=tfreeze) clip_after = final.subclip(t_start=tfreeze + 1) clip = final.subclip(t_start=tfreeze, t_end=tfreeze + 1) if int(i) % 2 == 0: clip = clip.fl_image(invert_colors).crossfadein(0.5).crossfadeout(0.5) else: clip = clip.fx(vfx.painting, saturation=1.6, black=0.006).crossfadein(0.5).crossfadeout(0.5) final = concatenate_videoclips([clip_before, clip, clip_after]) else: pass # === Final Saving === video = get_sql_handler().get_video(video_id) final.write_videofile(filename=video.local_file_path(), verbose=True, codec="libx264", audio_codec='aac', temp_audiofile=f'temp-audio-{video.video_id}.m4a', remove_temp=True, preset="medium", ffmpeg_params=["-profile:v", "baseline", "-level", "3.0", "-pix_fmt", "yuv420p"]) # close local files because we don't need them anymore and so they can be removed later for clip in clips: clip.close() if audio_clip: audio_clip.close() # upload to cold storage save_video(video, sync=True, clean=False)