verifyai / extractors /frames.py
Erich Schlaepfer
backend
87adc05
Raw
History Blame Contribute Delete
1.36 kB
"""
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