| """ |
| 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") |
| |
| 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 |
|
|