import gradio as gr import moviepy as mp import os def animate_video(video_path, animation_type, rotate_angle=0, move_x=0, move_y=0, fade_in_duration=0, fade_out_duration=0): # Load the video video = mp.editor.VideoFileClip(video_path) # Apply the selected animation if animation_type == "rotate": video = video.rotate(rotate_angle) elif animation_type == "move": # Define movement final_duration = video.duration video = video.set_position(lambda t: ( move_x * (t / final_duration), move_y * (t / final_duration) )) elif animation_type == "fade_in": video = video.fx(mp.editor.vfx.fadein, fade_in_duration) elif animation_type == "fade_out": video = video.fx(mp.editor.vfx.fadeout, fade_out_duration) # Composite the final video final_video = mp.editor.CompositeVideoClip([video]) # Save the final video with a unique name output_path = f"output_video_{os.path.basename(video_path)}.mp4" final_video.write_videofile(output_path, codec="libx264") return output_path # Gradio interface animation_types = ["rotate", "move", "fade_in", "fade_out"] def update_ui(animation_type): return [ gr.Slider.update(visible=animation_type == "rotate"), gr.Slider.update(visible=animation_type == "move"), gr.Slider.update(visible=animation_type == "move"), gr.Slider.update(visible=animation_type == "fade_in"), gr.Slider.update(visible=animation_type == "fade_out"), ] # Logo URL logo_url = "https://huggingface.co/spaces/Felguk/VideoAnimation/resolve/main/3077486-dzn2ssxc-v4.png" # Create Gradio interface logo_html = f'Logo' logo_component = gr.HTML(value=logo_html) interface = gr.Interface( fn=animate_video, inputs=[ logo_component, # Add logo component here gr.Video(label="Input Video"), gr.Dropdown(animation_types, label="Animation Type"), gr.Slider(minimum=-360, maximum=360, value=0, label="Rotate Angle (degrees)", visible=False), gr.Slider(minimum=-500, maximum=500, value=0, label="Move X (pixels)", visible=False), gr.Slider(minimum=-500, maximum=500, value=0, label="Move Y (pixels)", visible=False), gr.Slider(minimum=0, maximum=5, value=0, label="Fade In Duration (seconds)", visible=False), gr.Slider(minimum=0, maximum=5, value=0, label="Fade Out Duration (seconds)", visible=False), ], outputs=gr.Video(label="Animated Video"), title="Video Animation with Gradio", description="Choose an animation type and customize the parameters to animate your video." ) # Show/hide sliders based on animation type interface.launch(server_name="0.0.0.0", server_port=7860) interface.load(fn=None, inputs=[None, gr.Dropdown.update(value="rotate")], outputs=update_ui("rotate")) interface.load(fn=None, inputs=[None, gr.Dropdown.update(value="move")], outputs=update_ui("move")) interface.load(fn=None, inputs=[None, gr.Dropdown.update(value="fade_in")], outputs=update_ui("fade_in")) interface.load(fn=None, inputs=[None, gr.Dropdown.update(value="fade_out")], outputs=update_ui("fade_out")) # Add event listener for dropdown change interface.change(fn=update_ui, inputs=[interface.inputs[1]], outputs=interface.inputs[2:])