Spaces:
Running
Running
import gradio as gr | |
from datetime import datetime | |
import random | |
import logging | |
from transformers.pipelines.audio_utils import ffmpeg_read | |
from moviepy import ( | |
ImageClip, | |
VideoFileClip, | |
TextClip, | |
CompositeVideoClip, | |
AudioFileClip, | |
concatenate_videoclips | |
) | |
# Set up logging | |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(message)s') | |
logger = logging.getLogger() | |
def generate_video_segments(video_path, segment_length=5): | |
"""Splits the video into segments and returns their paths.""" | |
video = VideoFileClip(video_path) | |
segment_paths = [] | |
logger.info(f"Video duration: {video.duration} seconds.") | |
for i, start in enumerate(range(0, int(video.duration), segment_length)): | |
end = min(start + segment_length, video.duration) | |
logger.info(f"Processing segment {i}: Start time = {start}s, End time = {end}s") | |
try: | |
segment_clip = video.subclipped(start, end) | |
segment_filename = f"segment_{i}.mp4" | |
logger.info(f"Writing segment {i} to file: {segment_filename}") | |
segment_clip.write_videofile(segment_filename, codec="libx264") | |
segment_paths.append(segment_filename) | |
except Exception as e: | |
logger.error(f"Error in processing segment {i}: {str(e)}") | |
logger.info(f"Total segments generated: {len(segment_paths)}") | |
return segment_paths | |
def segment_video(file): | |
if file is None: | |
logger.error("No file uploaded.") | |
return "No file uploaded.", [] | |
logger.info("Starting video segmentation.") | |
segments = generate_video_segments(file.name) | |
logger.info("Video segmentation complete.") | |
return "Video segmented successfully!", segments | |
with gr.Blocks() as demo: | |
gr.Markdown("## Video Segmentation Preview") | |
file_input = gr.File(label="Upload Video") | |
segment_button = gr.Button("Generate Segments") | |
output_text = gr.Textbox() | |
video_gallery = gr.Gallery(label="Video Segments") # Displays multiple previews | |
segment_button.click(segment_video, inputs=file_input, outputs=[output_text, video_gallery]) | |
demo.launch() |