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
|