""" Extração inteligente de frames usando imageio + pyav. Pega 1 frame a cada N para eficiência, sem carregar o vídeo inteiro na RAM. """ import imageio.v3 as iio import numpy as np def get_video_metadata(video_path: str) -> dict: """Retorna FPS, duração e total de frames do vídeo.""" props = iio.improps(video_path, plugin="pyav") # Conta frames via iteração (mais confiável que metadados) total = 0 for _ in iio.imiter(video_path, plugin="pyav"): total += 1 fps = props.fps if hasattr(props, "fps") else 30.0 duration = total / fps if fps > 0 else 0.0 return { "total_frames": total, "fps": float(fps), "duration_sec": round(duration, 2), } def extract_frames( video_path: str, every_n: int = 10, max_frames: int = 30, ) -> tuple[list[np.ndarray], list[int]]: """ Extrai 1 frame a cada `every_n` frames do vídeo. Retorna no máximo `max_frames` frames. Returns: (frames, indices): lista de imagens RGB e seus índices originais. """ frames = [] indices = [] for i, frame in enumerate(iio.imiter(video_path, plugin="pyav")): if i % every_n != 0: continue frames.append(frame) indices.append(i) if len(frames) >= max_frames: break return frames, indices