Spaces:
Running
Running
import streamlit as st | |
from moviepy.editor import AudioFileClip, ImageClip, concatenate_videoclips | |
from moviepy.video.VideoClip import TextClip | |
import tempfile | |
import os | |
def generate_video(image_path, audio_path, output_path): | |
""" | |
Generates a video from an image and an audio file. | |
Args: | |
image_path (str): Path to the image file. | |
audio_path (str): Path to the audio file. | |
output_path (str): Path where the output video will be saved. | |
""" | |
# Load audio and image | |
audio_clip = AudioFileClip(audio_path) | |
image_clip = ImageClip(image_path).set_duration(audio_clip.duration) | |
# Resize the image to fit standard video dimensions (optional) | |
image_clip = image_clip.resize(height=720) | |
# Set audio to the image clip | |
video = image_clip.set_audio(audio_clip) | |
# Write the final video file | |
video.write_videofile(output_path, codec="libx264", audio_codec="aac") | |
# Streamlit App | |
st.title("Video Creator: Image + Audio") | |
# Upload the audio file | |
uploaded_audio = st.file_uploader("Upload your MP3 file", type=["mp3"]) | |
# Upload the image file | |
uploaded_image = st.file_uploader("Upload your image file", type=["jpg", "jpeg", "png"]) | |
# Temporary directories to handle file uploads | |
if uploaded_audio and uploaded_image: | |
with tempfile.TemporaryDirectory() as temp_dir: | |
# Save uploaded audio to temporary file | |
audio_path = os.path.join(temp_dir, uploaded_audio.name) | |
with open(audio_path, "wb") as f: | |
f.write(uploaded_audio.read()) | |
# Save uploaded image to temporary file | |
image_path = os.path.join(temp_dir, uploaded_image.name) | |
with open(image_path, "wb") as f: | |
f.write(uploaded_image.read()) | |
# Output video path | |
output_video_path = os.path.join(temp_dir, "output_video.mp4") | |
# Generate the video | |
st.write("Creating video... Please wait.") | |
generate_video(image_path, audio_path, output_video_path) | |
# Allow user to download the video | |
with open(output_video_path, "rb") as video_file: | |
st.download_button( | |
label="Download the video", | |
data=video_file, | |
file_name="output_video.mp4", | |
mime="video/mp4" | |
) | |
st.success("Video created successfully!") | |
else: | |
st.info("Please upload both an MP3 file and an image file to create the video.") | |