import gradio as gr from moviepy.editor import VideoFileClip, TextClip, CompositeVideoClip, concatenate_videoclips, vfx, afx def process_video(video_path, tool, text=None, start_time=0, end_time=None, speed=1.0, volume=1.0, color=(255, 255, 255), fontsize=50): clip = VideoFileClip(video_path) if tool == "Trim": clip = clip.subclip(start_time, end_time) elif tool == "Speed up": clip = clip.fx(vfx.speedx, speed) elif tool == "Slow down": clip = clip.fx(vfx.speedx, 1/speed) elif tool == "Add text": txt_clip = TextClip(text, fontsize=fontsize, color=color) txt_clip = txt_clip.set_position('center').set_duration(clip.duration) clip = CompositeVideoClip([clip, txt_clip]) elif tool == "Volume up": clip = clip.fx(afx.volumex, volume) elif tool == "Volume down": clip = clip.fx(afx.volumex, 1/volume) elif tool == "Black and White": clip = clip.fx(vfx.blackwhite) elif tool == "Invert colors": clip = clip.fx(vfx.invert_colors) elif tool == "Mirror": clip = clip.fx(vfx.mirror_x) elif tool == "Flip vertically": clip = clip.fx(vfx.mirror_y) elif tool == "Rotate": clip = clip.fx(vfx.rotate, 90) elif tool == "Fade in": clip = clip.fx(vfx.fadein, 2) elif tool == "Fade out": clip = clip.fx(vfx.fadeout, 2) elif tool == "Crop": clip = clip.crop(x1=100, y1=100, x2=400, y2=400) elif tool == "Resize": clip = clip.resize(height=360) elif tool == "Loop": clip = concatenate_videoclips([clip, clip]) elif tool == "Reverse": clip = clip.fx(vfx.time_mirror) elif tool == "Add audio": audio_clip = afx.audio_loop(clip.audio, duration=clip.duration) clip = clip.set_audio(audio_clip) elif tool == "Remove audio": clip = clip.without_audio() output_path = "output.mp4" clip.write_videofile(output_path, codec="libx264") return output_path tools = [ "Trim", "Speed up", "Slow down", "Add text", "Volume up", "Volume down", "Black and White", "Invert colors", "Mirror", "Flip vertically", "Rotate", "Fade in", "Fade out", "Crop", "Resize", "Loop", "Reverse", "Add audio", "Remove audio" ] interface = gr.Interface( fn=process_video, inputs=[ gr.Video(label="Input Video"), gr.Dropdown(label="Tool", choices=tools), gr.Textbox(label="Text", visible=False), gr.Number(label="Start Time (s)", visible=False), gr.Number(label="End Time (s)", visible=False), gr.Number(label="Speed", visible=False), gr.Number(label="Volume", visible=False), gr.ColorPicker(label="Text Color", visible=False), gr.Number(label="Font Size", visible=False) ], outputs=gr.Video(label="Output Video"), live=False, title="MoviePy Video Editor", description="Edit your video using various tools from MoviePy." ) def update_interface(tool): return [ gr.Textbox(visible=tool == "Add text"), gr.Number(visible=tool in ["Trim", "Speed up", "Slow down"]), gr.Number(visible=tool in ["Trim"]), gr.Number(visible=tool in ["Speed up", "Slow down"]), gr.Number(visible=tool in ["Volume up", "Volume down"]), gr.ColorPicker(visible=tool == "Add text"), gr.Number(visible=tool == "Add text") ] interface.launch()