Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| from moviepy.editor import * | |
| from PIL import Image | |
| import tempfile | |
| import os | |
| st.set_page_config(page_title="Image to Video", layout="centered") | |
| st.title("🖼️➡️🎞️ Convert Images to Video with Captions") | |
| uploaded_files = st.file_uploader("Upload Images", type=["jpg", "jpeg", "png"], accept_multiple_files=True) | |
| duration = st.slider("Duration per image (sec)", 2, 10, 4) | |
| if uploaded_files: | |
| captions = [] | |
| st.subheader("Add a caption for each image:") | |
| for i, image_file in enumerate(uploaded_files): | |
| st.image(image_file, width=150) | |
| cap = st.text_input(f"Caption for image {i+1}", key=f"caption_{i}") | |
| captions.append(cap) | |
| if st.button("Generate Video"): | |
| with st.spinner("Processing..."): | |
| temp_dir = tempfile.mkdtemp() | |
| clips = [] | |
| for i, file in enumerate(uploaded_files): | |
| img = Image.open(file).convert("RGB") | |
| img_path = os.path.join(temp_dir, f"img_{i}.jpg") | |
| img.save(img_path) | |
| clip = ImageClip(img_path).set_duration(duration) | |
| if captions[i]: | |
| txt = TextClip(captions[i], fontsize=24, color='white', bg_color='black', size=clip.size) | |
| txt = txt.set_duration(duration).set_position(("center", "bottom")) | |
| clip = CompositeVideoClip([clip, txt]) | |
| clips.append(clip) | |
| final_video = concatenate_videoclips(clips, method="compose") | |
| video_path = os.path.join(temp_dir, "output.mp4") | |
| final_video.write_videofile(video_path, fps=24) | |
| with open(video_path, "rb") as f: | |
| video_bytes = f.read() | |
| st.video(video_bytes) | |
| st.download_button("Download Video", video_bytes, file_name="video.mp4", mime="video/mp4") | |