diff --git a/server/main.py b/server/main.py index 1e4b02a..416d62f 100644 --- a/server/main.py +++ b/server/main.py @@ -188,6 +188,23 @@ def process_video_task(task_id: str, req: GenerateRequest): # Clear buffer frame_buffer.clear() + # Seek once to the starting frame. Avoid random-access seek on every frame. + if req.start_frame > 0: + seek_ok = cap.set(cv2.CAP_PROP_POS_FRAMES, req.start_frame) + if not seek_ok: + print( + f"[FaceMask] Warning: CAP_PROP_POS_FRAMES seek failed, " + f"fallback to sequential skip ({req.start_frame} frames)" + ) + for _ in range(req.start_frame): + ret, _ = cap.read() + if not ret: + tasks[task_id].status = TaskStatus.FAILED + tasks[task_id].message = ( + f"Failed to seek to start frame: {req.start_frame}" + ) + return + # Process loop with batching current_count = 0 for frame_idx in range(req.start_frame, end_frame + 1): @@ -196,8 +213,7 @@ def process_video_task(task_id: str, req: GenerateRequest): tasks[task_id].message = "Cancelled by user" break - # Read frame - cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx) + # Read next frame sequentially (after one-time initial seek) ret, frame = cap.read() if ret: