|
import streamlit as st |
|
import moviepy.editor as mp |
|
import tempfile |
|
import os |
|
|
|
def main(): |
|
st.title("Simple Video Editor") |
|
|
|
|
|
video_file = st.file_uploader("Upload a video file (MP4)", type=["mp4"]) |
|
audio_file = st.file_uploader("Upload an audio file (MP3 or WAV)", type=["mp3", "wav"]) |
|
|
|
if video_file and audio_file: |
|
|
|
temp_video = tempfile.NamedTemporaryFile(delete=False, suffix=".mp4") |
|
temp_video.write(video_file.read()) |
|
temp_video_path = temp_video.name |
|
|
|
temp_audio = tempfile.NamedTemporaryFile(delete=False, suffix=f".{audio_file.name.split('.')[-1]}") |
|
temp_audio.write(audio_file.read()) |
|
temp_audio_path = temp_audio.name |
|
|
|
|
|
video = mp.VideoFileClip(temp_video_path) |
|
audio = mp.AudioFileClip(temp_audio_path) |
|
|
|
|
|
st.write(f"Video duration: {video.duration:.2f} seconds") |
|
st.write(f"Audio duration: {audio.duration:.2f} seconds") |
|
|
|
|
|
st.subheader("Trim Video") |
|
video_start = st.slider("Video start time (seconds)", 0.0, video.duration, 0.0) |
|
video_end = st.slider("Video end time (seconds)", 0.0, video.duration, video.duration) |
|
trimmed_video = video.subclip(video_start, video_end) |
|
|
|
|
|
st.subheader("Trim Audio") |
|
audio_start = st.slider("Audio start time (seconds)", 0.0, audio.duration, 0.0) |
|
audio_end = st.slider("Audio end time (seconds)", 0.0, audio.duration, audio.duration) |
|
trimmed_audio = audio.subclip(audio_start, audio_end) |
|
|
|
|
|
if st.button("Combine Video and Audio"): |
|
final_clip = trimmed_video.set_audio(trimmed_audio) |
|
|
|
|
|
output_path = "output_video.mp4" |
|
final_clip.write_videofile(output_path, codec="libx264", audio_codec="aac") |
|
|
|
|
|
st.success("Video processing complete!") |
|
with open(output_path, "rb") as file: |
|
btn = st.download_button( |
|
label="Download processed video", |
|
data=file, |
|
file_name="processed_video.mp4", |
|
mime="video/mp4" |
|
) |
|
|
|
|
|
st.subheader("Preview Processed Video") |
|
st.video(output_path) |
|
|
|
|
|
video.close() |
|
audio.close() |
|
os.unlink(temp_video_path) |
|
os.unlink(temp_audio_path) |
|
|
|
if __name__ == "__main__": |
|
main() |