import cv2 import os import logging # Setup logging logging.basicConfig( filename="app.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) # Global video capture object video_cap = None current_frame_index = 0 def preload_video(video_path): """ Preload the video file. Args: video_path: Path to the video file Returns: str: Status message """ global video_cap, current_frame_index try: if not os.path.exists(video_path): raise FileNotFoundError(f"Video file not found at {video_path}") video_cap = cv2.VideoCapture(video_path) if not video_cap.isOpened(): raise RuntimeError("Failed to open video file.") current_frame_index = 0 total_frames = int(video_cap.get(cv2.CAP_PROP_FRAME_COUNT)) logging.info(f"Preloaded video: {video_path} with {total_frames} frames.") return f"Successfully loaded video: {video_path} ({total_frames} frames)" except Exception as e: logging.error(f"Error preloading video: {str(e)}") return f"Error loading video: {str(e)}" def get_next_video_frame(): """ Get the next frame from the video. Returns: numpy array: Frame if successful, None otherwise """ global video_cap, current_frame_index if video_cap is None or not video_cap.isOpened(): logging.error("Video capture not initialized.") return None try: # Set frame position video_cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame_index) ret, frame = video_cap.read() if not ret: # Loop back to the start current_frame_index = 0 video_cap.set(cv2.CAP_PROP_POS_FRAMES, current_frame_index) ret, frame = video_cap.read() if not ret: raise RuntimeError("Failed to read frame from video.") current_frame_index += 1 logging.debug(f"Retrieved frame {current_frame_index} from video.") return frame except Exception as e: logging.error(f"Error retrieving frame: {str(e)}") return None def reset_video_index(): """ Reset the frame index to the beginning. """ global current_frame_index current_frame_index = 0 logging.info("Reset video frame index to 0.") def release_video(): """ Release the video capture object. """ global video_cap if video_cap is not None: video_cap.release() video_cap = None logging.info("Released video capture object.")