39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Python
		
	
from typing import Any, Optional
 | 
						|
import cv2
 | 
						|
 | 
						|
def get_video_frame(video_path: str, frame_number: int = 0) -> Optional[Any]:
 | 
						|
    """Retrieve a specific frame from a video."""
 | 
						|
    capture = cv2.VideoCapture(video_path)
 | 
						|
 | 
						|
    if not capture.isOpened():
 | 
						|
        print(f"Error: Cannot open video file {video_path}")
 | 
						|
        return None
 | 
						|
 | 
						|
    frame_total = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
 | 
						|
 | 
						|
    # Ensure frame_number is within the valid range
 | 
						|
    frame_number = max(0, min(frame_number, frame_total - 1))
 | 
						|
 | 
						|
    capture.set(cv2.CAP_PROP_POS_FRAMES, frame_number)
 | 
						|
    has_frame, frame = capture.read()
 | 
						|
    capture.release()
 | 
						|
 | 
						|
    if not has_frame:
 | 
						|
        print(f"Error: Cannot read frame {frame_number} from {video_path}")
 | 
						|
        return None
 | 
						|
    
 | 
						|
    return frame
 | 
						|
 | 
						|
def get_video_frame_total(video_path: str) -> int:
 | 
						|
    """Get the total number of frames in a video."""
 | 
						|
    capture = cv2.VideoCapture(video_path)
 | 
						|
 | 
						|
    if not capture.isOpened():
 | 
						|
        print(f"Error: Cannot open video file {video_path}")
 | 
						|
        return 0
 | 
						|
    
 | 
						|
    frame_total = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
 | 
						|
    capture.release()
 | 
						|
 | 
						|
    return frame_total
 |