Spaces:
Sleeping
Sleeping
File size: 1,840 Bytes
07d9197 78a2505 07d9197 78a2505 07d9197 78a2505 07d9197 78a2505 07d9197 78a2505 07d9197 78a2505 07d9197 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | import gradio as gr
from moviepy.editor import VideoFileClip
from PIL import Image
import numpy as np
import os
import uuid
FRECUENCIA = 5 # segundos entre capturas
DURACION_MAXIMA = 30 # tope de duración a procesar (segundos)
os.makedirs("frames", exist_ok=True)
def extract_frames(video):
# 1) Guardar binario a disco
video_id = str(uuid.uuid4())[:8]
video_filename = f"{video_id}.mp4"
video_path = os.path.join("frames", video_filename)
with open(video_path, "wb") as f:
f.write(video.read())
# 2) Carpeta para frames
video_frames_dir = os.path.join("frames", video_id)
os.makedirs(video_frames_dir, exist_ok=True)
# 3) Procesar video
clip = VideoFileClip(video_path)
try:
duration = int(min(clip.duration or 0, DURACION_MAXIMA))
frame_filepaths = []
for t in range(0, max(duration, 0), FRECUENCIA):
frame = clip.get_frame(t) # numpy array (H, W, 3)
frame_path = os.path.join(video_frames_dir, f"frame_{t}s.jpg")
Image.fromarray(np.uint8(frame)).save(frame_path, quality=90)
frame_filepaths.append(frame_path)
finally:
clip.close()
# 4) Devolvemos:
# a) Files => Gradio publica y te da URLs /file=...
# b) JSON con metadatos
meta = {
"video_id": video_id,
"total_frames": len(frame_filepaths),
"frequency_seconds": FRECUENCIA,
"processed_seconds": duration
}
return frame_filepaths, meta
iface = gr.Interface(
fn=extract_frames,
inputs=gr.File(type="binary", label="Upload MP4"),
outputs=[
gr.Files(label="Frames"), # => enlaces descargables públicos
gr.JSON(label="Metadata") # => info útil
],
title="Video Frame Extractor",
allow_flagging="never"
)
iface.launch()
|