feat(main.py): add functionality to reposition segments in multi-segment mode
This commit is contained in:
46
main.py
46
main.py
@@ -362,8 +362,13 @@ class MediaGrader:
|
|||||||
self.jump_history[current_file].append(self.current_frame)
|
self.jump_history[current_file].append(self.current_frame)
|
||||||
|
|
||||||
# Jump to the target frame
|
# Jump to the target frame
|
||||||
self.current_cap.set(cv2.CAP_PROP_POS_FRAMES, target_frame)
|
if self.multi_segment_mode:
|
||||||
self.load_current_frame()
|
# 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()
|
||||||
|
|
||||||
# Increment jump counter
|
# Increment jump counter
|
||||||
self.jump_counters[current_file] += 1
|
self.jump_counters[current_file] += 1
|
||||||
@@ -514,9 +519,9 @@ class MediaGrader:
|
|||||||
# Calculate segment positions - evenly spaced through video
|
# Calculate segment positions - evenly spaced through video
|
||||||
self.segment_positions = []
|
self.segment_positions = []
|
||||||
for i in range(self.segment_count):
|
for i in range(self.segment_count):
|
||||||
# Position segments at 0%, 25%, 50%, 75% of video
|
# Position segments at 0%, 25%, 50%, 75% of video (not 0%, 33%, 66%, 100%)
|
||||||
position_ratio = i / max(1, self.segment_count - 1) if self.segment_count > 1 else 0
|
position_ratio = i / self.segment_count # This gives 0, 0.25, 0.5, 0.75
|
||||||
start_frame = int(position_ratio * (self.total_frames - 1))
|
start_frame = int(position_ratio * self.total_frames)
|
||||||
self.segment_positions.append(start_frame)
|
self.segment_positions.append(start_frame)
|
||||||
|
|
||||||
# Create video captures for each segment
|
# Create video captures for each segment
|
||||||
@@ -562,6 +567,37 @@ class MediaGrader:
|
|||||||
if ret:
|
if ret:
|
||||||
self.segment_frames[i] = frame
|
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):
|
def seek_all_segments(self, frames_delta: int):
|
||||||
"""Seek all segments by the specified number of frames"""
|
"""Seek all segments by the specified number of frames"""
|
||||||
if not self.multi_segment_mode or not self.segment_caps:
|
if not self.multi_segment_mode or not self.segment_caps:
|
||||||
|
Reference in New Issue
Block a user