Spaces:
Sleeping
Sleeping
import os | |
import shutil | |
import tempfile | |
import zipfile | |
from pathlib import Path | |
import ffmpeg | |
import gradio as gr | |
RESOLUTIONS = { | |
"Original": None, | |
"512x512": (512, 512), | |
"768x768": (768, 768), | |
"1024x576": (1024, 576) | |
} | |
def extract_frames(video_path, fps=1, resolution=None): | |
temp_dir = tempfile.mkdtemp() | |
output_dir = Path(temp_dir) / "frames" | |
output_dir.mkdir(parents=True, exist_ok=True) | |
output_pattern = str(output_dir / "frame_%04d.jpg") | |
filters = [f"fps={fps}", "unsharp=5:5:1.0"] | |
if resolution: | |
filters.append(f"scale={resolution[0]}:{resolution[1]}") | |
filter_str = ",".join(filters) | |
try: | |
( | |
ffmpeg | |
.input(video_path) | |
.output(output_pattern, vf=filter_str, qscale=2) | |
.run() | |
) | |
except ffmpeg.Error as e: | |
print("FFmpeg error:", e) | |
raise gr.Error("Failed to extract frames with FFmpeg.") | |
return output_dir | |
def zip_frames(frame_dir): | |
zip_path = tempfile.NamedTemporaryFile(delete=False, suffix=".zip").name | |
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf: | |
for file_path in Path(frame_dir).glob("*.jpg"): | |
zipf.write(file_path, arcname=file_path.name) | |
return zip_path | |
def process_video(video_path, fps, resolution_label): | |
resolution = RESOLUTIONS[resolution_label] | |
try: | |
frames_path = extract_frames(video_path, fps, resolution) | |
zip_path = zip_frames(frames_path) | |
shutil.rmtree(frames_path.parent) | |
return zip_path | |
except Exception as e: | |
print("Error during processing:", str(e)) | |
raise gr.Error(f"Failed to extract frames: {str(e)}") |