diff --git a/croppa/main.py b/croppa/main.py index 46168b5..36570ea 100644 --- a/croppa/main.py +++ b/croppa/main.py @@ -2795,13 +2795,24 @@ class VideoEditor: return False - def _process_frame_for_render(self, frame, output_width: int, output_height: int): + def _process_frame_for_render(self, frame, output_width: int, output_height: int, frame_number: int = None): """Process a single frame for rendering (optimized for speed)""" try: # Apply crop (vectorized operation) if self.crop_rect: x, y, w, h = map(int, self.crop_rect) + # Apply motion tracking to move crop center to tracked point + if self.motion_tracker.tracking_enabled and frame_number is not None: + current_pos = self.motion_tracker.get_interpolated_position(frame_number) + if current_pos: + # Move crop center to tracked point + tracked_x, tracked_y = current_pos + # Calculate new crop position to center on tracked point + new_x = int(tracked_x - w // 2) + new_y = int(tracked_y - h // 2) + x, y = new_x, new_y + # Clamp coordinates to frame bounds h_frame, w_frame = frame.shape[:2] x = max(0, min(x, w_frame - 1)) @@ -2902,6 +2913,7 @@ class VideoEditor: last_progress_update = 0 self.render_progress_queue.put(("progress", f"Processing {total_frames} frames...", 0.1, 0.0)) + with open(self.temp_file_name, 'wb') as temp_file: for i in range(total_frames): if self.render_cancelled: @@ -2913,7 +2925,7 @@ class VideoEditor: if not ret: break - processed_frame = self._process_frame_for_render(frame, output_width, output_height) + processed_frame = self._process_frame_for_render(frame, output_width, output_height, start_frame + i) if processed_frame is not None: if i == 0: print(f"Processed frame dimensions: {processed_frame.shape[1]}x{processed_frame.shape[0]}")