File size: 1,685 Bytes
9fea5e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
53
54
55
56
import cv2
import multiprocessing
from pathlib import Path
import numpy as np
from typing import List, Tuple
import os

def extract_frames_from_video(args: Tuple[str, str, int]):
    """

    Extract frames from a video file at specified FPS

    args: (input_video_path, output_folder, target_fps)

    """
    video_path, output_folder, target_fps = args
    video_name = Path(video_path).stem
    
    # Create output folder
    frames_dir = Path(output_folder) / video_name
    frames_dir.mkdir(parents=True, exist_ok=True)
    
    try:
        # Open video file
        cap = cv2.VideoCapture(str(video_path))
        if not cap.isOpened():
            print(f"Error: Could not open video {video_path}")
            return
        
        # Get video properties
        original_fps = cap.get(cv2.CAP_PROP_FPS)
        total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        
        # Calculate frame extraction interval
        interval = int(original_fps / target_fps)
        
        frame_count = 0
        saved_count = 0
        
        while True:
            ret, frame = cap.read()
            if not ret:
                break
                
            # Extract frame at target FPS
            if frame_count % interval == 0:
                frame_path = frames_dir / f"frame_{saved_count:06d}.jpg"
                cv2.imwrite(str(frame_path), frame)
                saved_count += 1
                
            frame_count += 1
            
        cap.release()
        return saved_count
        
    except Exception as e:
        print(f"Error processing {video_path}: {str(e)}")
        return 0