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