Video2chunks / app.py
Ahmadkhan12's picture
Update app.py
1efe4c2 verified
import os
import subprocess
import gradio as gr
def check_video_size(video_path, max_size_mb=1000): # Allow up to 1 GB
size_mb = os.path.getsize(video_path) / (1024 * 1024)
if size_mb > max_size_mb:
raise gr.Error(f"Video is too large (max {max_size_mb} MB allowed). Please compress the video before uploading.")
def split_video_into_chunks(video_path, chunk_duration=6, output_dir="video_chunks"):
# Create output directory
os.makedirs(output_dir, exist_ok=True)
# Get video duration using FFmpeg
cmd_duration = [
"ffprobe", "-v", "error", "-show_entries", "format=duration",
"-of", "default=noprint_wrappers=1:nokey=1", video_path
]
duration = float(subprocess.run(cmd_duration, capture_output=True, text=True).stdout.strip())
# Calculate the number of chunks
num_chunks = int(duration // chunk_duration)
# Split the video into chunks using FFmpeg
chunk_files = []
for i in range(num_chunks):
start_time = i * chunk_duration
output_file = os.path.join(output_dir, f"chunk_{i+1}.mp4")
# FFmpeg command to extract the chunk (using -c copy for speed)
command = [
"ffmpeg", "-i", video_path,
"-ss", str(start_time),
"-t", str(chunk_duration),
"-c", "copy", # Directly copy video and audio streams (no re-encoding)
output_file
]
subprocess.run(command, check=True)
chunk_files.append(output_file)
return chunk_files
def process_video(video, chunk_duration):
# Check video size (up to 1 GB allowed)
check_video_size(video, max_size_mb=1000)
# Split the video into chunks with the specified duration
chunk_files = split_video_into_chunks(video, chunk_duration=chunk_duration)
# Return the list of chunk files for download
return chunk_files
# Gradio Interface
def gradio_interface(video, chunk_duration, progress=gr.Progress()):
progress(0, desc="Uploading video... (This may take a while for large files)")
progress(0.5, desc="Processing video...")
chunk_files = process_video(video, chunk_duration)
progress(1.0, desc="Done!")
return chunk_files
# Define Gradio app
iface = gr.Interface(
fn=gradio_interface,
inputs=[
gr.Video(label="Upload Video"),
gr.Slider(minimum=1, maximum=60, value=6, step=1, label="Chunk Duration (seconds)")
],
outputs=gr.Files(label="Download Chunks"),
title="Video Splitter with Custom Chunk Duration",
description="Upload a video (max 1 GB) and choose the chunk duration in seconds. The app will split the video into chunks for download. **Tip:** Compress your video before uploading for faster processing."
)
# Launch the app
iface.launch()