import streamlit as st from moviepy.editor import VideoFileClip, concatenate_videoclips, TextClip, CompositeVideoClip, AudioFileClip from moviepy.video.fx.all import crop, resize, mirror_x import os # Streamlit app st.set_page_config(page_title="🎥 Pro Video Editor", page_icon="🎬", layout="wide") st.title("🎥 Pro Video Editor") st.write("Edit your videos like a pro with this easy-to-use tool!") # Upload video uploaded_file = st.file_uploader("Upload a video:", type=["mp4", "avi", "mov"]) if uploaded_file is not None: # Save uploaded file with open("input_video.mp4", "wb") as f: f.write(uploaded_file.getbuffer()) # Load video video = VideoFileClip("input_video.mp4") # Sidebar for editing options st.sidebar.header("Editing Options") task = st.sidebar.selectbox("Select a task:", [ "Trim Video", "Crop Video", "Add Text", "Add Music", "Resize Video", "Export Video" ]) if task == "Trim Video": st.header("✂️ Trim Video") st.write("Select the start and end time to trim your video.") start_time = st.number_input("Start Time (seconds):", min_value=0, max_value=int(video.duration)) end_time = st.number_input("End Time (seconds):", min_value=0, max_value=int(video.duration)) if st.button("Trim Video"): with st.spinner("Trimming video..."): trimmed_video = video.subclip(start_time, end_time) trimmed_video.write_videofile("trimmed_video.mp4") st.success("Video trimmed successfully!") st.video("trimmed_video.mp4") elif task == "Crop Video": st.header("🌾 Crop Video") st.write("Crop your video by selecting the area.") x1 = st.number_input("X1:", min_value=0, max_value=video.size[0]) y1 = st.number_input("Y1:", min_value=0, max_value=video.size[1]) x2 = st.number_input("X2:", min_value=0, max_value=video.size[0]) y2 = st.number_input("Y2:", min_value=0, max_value=video.size[1]) if st.button("Crop Video"): with st.spinner("Cropping video..."): cropped_video = crop(video, x1=x1, y1=y1, x2=x2, y2=y2) cropped_video.write_videofile("cropped_video.mp4") st.success("Video cropped successfully!") st.video("cropped_video.mp4") elif task == "Add Text": st.header("✍️ Add Text") st.write("Add text to your video with custom font size, color, and position.") text = st.text_input("Enter text:") fontsize = st.number_input("Font Size:", min_value=10, max_value=100, value=50) color = st.color_picker("Text Color:", "#FFFFFF") position_x = st.number_input("Position X:", min_value=0, max_value=video.size[0]) position_y = st.number_input("Position Y:", min_value=0, max_value=video.size[1]) if st.button("Add Text"): with st.spinner("Adding text..."): text_clip = TextClip(text, fontsize=fontsize, color=color) text_clip = text_clip.set_position((position_x, position_y)).set_duration(video.duration) final_video = CompositeVideoClip([video, text_clip]) final_video.write_videofile("text_video.mp4") st.success("Text added successfully!") st.video("text_video.mp4") elif task == "Add Music": st.header("🎵 Add Music") st.write("Add background music to your video.") music_file = st.file_uploader("Upload a music file:", type=["mp3", "wav"]) if music_file and st.button("Add Music"): with st.spinner("Adding music..."): with open("background_music.mp3", "wb") as f: f.write(music_file.getbuffer()) audio_clip = AudioFileClip("background_music.mp3") final_video = video.set_audio(audio_clip) final_video.write_videofile("music_video.mp4") st.success("Music added successfully!") st.video("music_video.mp4") elif task == "Resize Video": st.header("📏 Resize Video") st.write("Resize your video to a specific width and height.") width = st.number_input("Width:", min_value=100, max_value=1920, value=video.size[0]) height = st.number_input("Height:", min_value=100, max_value=1080, value=video.size[1]) if st.button("Resize Video"): with st.spinner("Resizing video..."): resized_video = resize(video, width=width, height=height) resized_video.write_videofile("resized_video.mp4") st.success("Video resized successfully!") st.video("resized_video.mp4") elif task == "Export Video": st.header("📤 Export Video") st.write("Your video is ready to download!") st.video("input_video.mp4") with open("input_video.mp4", "rb") as f: st.download_button("Download Video", f, file_name="edited_video.mp4") # Clean up temporary files if os.path.exists("input_video.mp4"): os.remove("input_video.mp4") if os.path.exists("trimmed_video.mp4"): os.remove("trimmed_video.mp4") if os.path.exists("cropped_video.mp4"): os.remove("cropped_video.mp4") if os.path.exists("text_video.mp4"): os.remove("text_video.mp4") if os.path.exists("music_video.mp4"): os.remove("music_video.mp4") if os.path.exists("resized_video.mp4"): os.remove("resized_video.mp4") if os.path.exists("background_music.mp3"): os.remove("background_music.mp3")