Spaces:
Running
Running
import streamlit as st | |
import ffmpeg | |
import os | |
from PIL import Image | |
def create_video(image_path, audio_path, output_path): | |
""" | |
Create a video from an image and an audio file using FFmpeg. | |
:param image_path: Path to the image file | |
:param audio_path: Path to the audio file | |
:param output_path: Path to save the output video | |
""" | |
try: | |
# FFmpeg command to create a video | |
input_image = ffmpeg.input(image_path, loop=1, t=ffmpeg.probe(audio_path)['format']['duration']) | |
input_audio = ffmpeg.input(audio_path) | |
ffmpeg.output(input_image, input_audio, output_path, vcodec='libx264', acodec='aac', pix_fmt='yuv420p', shortest=None).run() | |
except Exception as e: | |
st.error(f"Error during video creation: {e}") | |
# Streamlit UI | |
st.title("Video Creator") | |
st.write("Upload an image and an audio file to create a video.") | |
# File uploaders | |
uploaded_image = st.file_uploader("Upload an Image", type=["jpg", "jpeg", "png"]) | |
uploaded_audio = st.file_uploader("Upload an MP3 file", type=["mp3"]) | |
if uploaded_image and uploaded_audio: | |
# Save uploaded files locally | |
image_path = f"temp_image.{uploaded_image.name.split('.')[-1]}" | |
audio_path = "temp_audio.mp3" | |
output_path = "output_video.mp4" | |
with open(image_path, "wb") as f: | |
f.write(uploaded_image.getbuffer()) | |
with open(audio_path, "wb") as f: | |
f.write(uploaded_audio.getbuffer()) | |
st.write("Files uploaded successfully.") | |
# Create video | |
st.write("Creating video...") | |
create_video(image_path, audio_path, output_path) | |
# Show and download video | |
if os.path.exists(output_path): | |
st.video(output_path) | |
with open(output_path, "rb") as f: | |
st.download_button( | |
label="Download Video", | |
data=f, | |
file_name="output_video.mp4", | |
mime="video/mp4" | |
) | |
# Cleanup temporary files | |
os.remove(image_path) | |
os.remove(audio_path) | |
os.remove(output_path) | |