refactor(main.py): implement safer frame positioning and handling for video segments to improve robustness
This commit is contained in:
22
main.py
22
main.py
@@ -539,14 +539,19 @@ class MediaGrader:
|
|||||||
if self.total_frames <= 1:
|
if self.total_frames <= 1:
|
||||||
print("Error: Video has insufficient frames for multi-segment mode")
|
print("Error: Video has insufficient frames for multi-segment mode")
|
||||||
return
|
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):
|
for i in range(self.segment_count):
|
||||||
if self.segment_count <= 1:
|
if self.segment_count <= 1:
|
||||||
position_ratio = 0
|
position_ratio = 0
|
||||||
else:
|
else:
|
||||||
position_ratio = i / (self.segment_count - 1)
|
position_ratio = i / (self.segment_count - 1)
|
||||||
start_frame = int(position_ratio * (self.total_frames - 1))
|
start_frame = int(position_ratio * (safe_frame_count - 1))
|
||||||
start_frame = max(0, min(start_frame, self.total_frames - 1)) # Clamp to valid range
|
start_frame = max(0, min(start_frame, safe_frame_count - 1)) # Clamp to safe range
|
||||||
self.segment_positions.append(start_frame)
|
self.segment_positions.append(start_frame)
|
||||||
print(f"Segment positions: {self.segment_positions}")
|
print(f"Segment positions: {self.segment_positions}")
|
||||||
|
|
||||||
@@ -618,7 +623,7 @@ class MediaGrader:
|
|||||||
if not cap.isOpened():
|
if not cap.isOpened():
|
||||||
return None, None
|
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)
|
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
|
||||||
ret, frame = cap.read()
|
ret, frame = cap.read()
|
||||||
|
|
||||||
@@ -627,6 +632,17 @@ class MediaGrader:
|
|||||||
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
|
cap.set(cv2.CAP_PROP_POS_FRAMES, start_frame)
|
||||||
return cap, frame.copy()
|
return cap, frame.copy()
|
||||||
else:
|
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()
|
cap.release()
|
||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user