diff --git a/main.py b/main.py index ce98732..dae9061 100644 --- a/main.py +++ b/main.py @@ -539,14 +539,19 @@ class MediaGrader: if self.total_frames <= 1: print("Error: Video has insufficient frames for multi-segment mode") return + + # Use a more conservative approach for segment positioning + # Instead of using total_frames directly, use a safer range + safe_frame_count = max(1, int(self.total_frames * 0.9)) # Use 90% of reported frames as safety margin + print(f"Using safe frame count: {safe_frame_count} (90% of reported {self.total_frames})") for i in range(self.segment_count): if self.segment_count <= 1: position_ratio = 0 else: position_ratio = i / (self.segment_count - 1) - start_frame = int(position_ratio * (self.total_frames - 1)) - start_frame = max(0, min(start_frame, self.total_frames - 1)) # Clamp to valid range + start_frame = int(position_ratio * (safe_frame_count - 1)) + start_frame = max(0, min(start_frame, safe_frame_count - 1)) # Clamp to safe range self.segment_positions.append(start_frame) print(f"Segment positions: {self.segment_positions}") @@ -618,7 +623,7 @@ class MediaGrader: if not cap.isOpened(): return None, None - # Seek to start frame and read initial frame + # Try seeking to the requested frame cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame) ret, frame = cap.read() @@ -627,6 +632,17 @@ class MediaGrader: cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame) return cap, frame.copy() else: + # Frame doesn't exist - try seeking to a safer position + # Try progressively earlier frames + for fallback_frame in [start_frame // 2, start_frame // 4, 0]: + cap.set(cv2.CAP_PROP_POS_FRAMES, fallback_frame) + ret, frame = cap.read() + if ret and frame is not None: + print(f"Segment {segment_index}: fell back from frame {start_frame} to {fallback_frame}") + cap.set(cv2.CAP_PROP_POS_FRAMES, fallback_frame) + return cap, frame.copy() + + # If all fallbacks failed, give up cap.release() return None, None