File size: 1,356 Bytes
87adc05 | 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 | """
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
|