diff --git a/core/streaming/readers.py b/core/streaming/readers.py index ef89724..6f31cf1 100644 --- a/core/streaming/readers.py +++ b/core/streaming/readers.py @@ -90,24 +90,30 @@ class RTSPReader: # Read frame immediately without rate limiting for minimum latency try: - ret, frame = self.cap.read() + # Force grab then retrieve for better error handling + ret = self.cap.grab() + if ret: + ret, frame = self.cap.retrieve() + else: + frame = None except Exception as read_error: - logger.error(f"Camera {self.camera_id}: cap.read() threw exception: {type(read_error).__name__}: {read_error}") + logger.error(f"Camera {self.camera_id}: cap.grab/retrieve threw exception: {type(read_error).__name__}: {read_error}") ret, frame = False, None if not ret or frame is None: consecutive_errors += 1 - # Verbose logging to see actual errors + # Enhanced logging to diagnose the issue logger.error(f"Camera {self.camera_id}: cap.read() failed - ret={ret}, frame={frame is not None}") # Try to get more info from the capture try: - if self.cap.isOpened(): + if self.cap and self.cap.isOpened(): backend = self.cap.getBackendName() - logger.debug(f"Camera {self.camera_id}: Capture still open, backend: {backend}") + pos_frames = self.cap.get(cv2.CAP_PROP_POS_FRAMES) + logger.error(f"Camera {self.camera_id}: Capture open, backend: {backend}, pos_frames: {pos_frames}") else: - logger.error(f"Camera {self.camera_id}: Capture is closed!") + logger.error(f"Camera {self.camera_id}: Capture is closed or None!") except Exception as info_error: logger.error(f"Camera {self.camera_id}: Error getting capture info: {type(info_error).__name__}: {info_error}")