Exemplo n.º 1
0
Arquivo: ve.py Projeto: huvipg/python
def addlogo(file_dir,img="",time=20,X=30,Y=30):
   
    clip = VideoFileClip(file_dir)
    img_clip = ImageClip(img)   #位置
    img_clip = img_clip.set_pos((X,Y)).set_duration(time)
    clip = CompositeVideoClip([clip, img_clip])
    filen = os.path.basename(file_dir)
    clip.write_videofile(work_path+"\\"+filen)
    clip.close()
Exemplo n.º 2
0
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)