feat(main.py): add functionality to reposition segments in multi-segment mode
This commit is contained in:
42
main.py
42
main.py
@@ -362,6 +362,11 @@ class MediaGrader:
|
||||
self.jump_history[current_file].append(self.current_frame)
|
||||
|
||||
# Jump to the target frame
|
||||
if self.multi_segment_mode:
|
||||
# In multi-segment mode, reposition all segments relative to the jump target
|
||||
self.reposition_segments_around_frame(target_frame)
|
||||
else:
|
||||
# In single mode, just jump the main capture
|
||||
self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame)
|
||||
self.load_current_frame()
|
||||
|
||||
@@ -514,9 +519,9 @@ class MediaGrader:
|
||||
# Calculate segment positions - evenly spaced through video
|
||||
self.segment_positions = []
|
||||
for i in range(self.segment_count):
|
||||
# Position segments at 0%, 25%, 50%, 75% of video
|
||||
position_ratio = i / max(1, self.segment_count - 1) if self.segment_count > 1 else 0
|
||||
start_frame = int(position_ratio * (self.total_frames - 1))
|
||||
# Position segments at 0%, 25%, 50%, 75% of video (not 0%, 33%, 66%, 100%)
|
||||
position_ratio = i / self.segment_count # This gives 0, 0.25, 0.5, 0.75
|
||||
start_frame = int(position_ratio * self.total_frames)
|
||||
self.segment_positions.append(start_frame)
|
||||
|
||||
# Create video captures for each segment
|
||||
@@ -562,6 +567,37 @@ class MediaGrader:
|
||||
if ret:
|
||||
self.segment_frames[i] = frame
|
||||
|
||||
def reposition_segments_around_frame(self, center_frame: int):
|
||||
"""Reposition all segments around a center frame while maintaining spacing"""
|
||||
if not self.multi_segment_mode or not self.segment_caps:
|
||||
return
|
||||
|
||||
# Calculate new segment positions around the center frame
|
||||
# Keep the same relative spacing but center around the new frame
|
||||
segment_spacing = self.total_frames // (self.segment_count + 1)
|
||||
|
||||
new_positions = []
|
||||
for i in range(self.segment_count):
|
||||
# Spread segments around center_frame
|
||||
offset = (i - (self.segment_count - 1) / 2) * segment_spacing
|
||||
new_frame = int(center_frame + offset)
|
||||
new_frame = max(0, min(new_frame, self.total_frames - 1))
|
||||
new_positions.append(new_frame)
|
||||
|
||||
# Update segment positions and seek all captures
|
||||
self.segment_positions = new_positions
|
||||
|
||||
for i, cap in enumerate(self.segment_caps):
|
||||
if cap and cap.isOpened():
|
||||
cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i])
|
||||
|
||||
# Load new frame
|
||||
ret, frame = cap.read()
|
||||
if ret:
|
||||
self.segment_frames[i] = frame
|
||||
# Reset position for next read
|
||||
cap.set(cv2.CAP_PROP_POS_FRAMES, self.segment_positions[i])
|
||||
|
||||
def seek_all_segments(self, frames_delta: int):
|
||||
"""Seek all segments by the specified number of frames"""
|
||||
if not self.multi_segment_mode or not self.segment_caps:
|
||||
|
Reference in New Issue
Block a user