diff --git a/scenedetect/scene_manager.py b/scenedetect/scene_manager.py index 82cce1cb..91d6d204 100644 --- a/scenedetect/scene_manager.py +++ b/scenedetect/scene_manager.py @@ -491,13 +491,19 @@ def get_event_list(self, base_timecode): for start, end in self._event_list] - def _process_frame(self, frame_num, frame_im): + def _process_frame(self, frame_num, frame_im, callback=None): # type(int, numpy.ndarray) -> None """ Adds any cuts detected with the current frame to the cutting list. """ for detector in self._detector_list: - self._cutting_list += detector.process_frame(frame_num, frame_im) + cuts = detector.process_frame(frame_num, frame_im) + if cuts and callback: + callback(frame_im, frame_num) + self._cutting_list += cuts for detector in self._sparse_detector_list: - self._event_list += detector.process_frame(frame_num, frame_im) + events = detector.process_frame(frame_num, frame_im) + if events and callback: + callback(frame_im, frame_num) + self._event_list += events def _is_processing_required(self, frame_num): @@ -516,9 +522,9 @@ def _post_process(self, frame_num): def detect_scenes(self, frame_source, end_time=None, frame_skip=0, - show_progress=True): + show_progress=True, callback=None): # type: (VideoManager, Union[int, FrameTimecode], - # Optional[Union[int, FrameTimecode]], Optional[bool]) -> int + # Optional[Union[int, FrameTimecode]], Optional[bool], optional[callable[numpy.ndarray]) -> int """ Perform scene detection on the given frame_source using the added SceneDetectors. Blocks until all frames in the frame_source have been processed. Results can @@ -540,6 +546,7 @@ def detect_scenes(self, frame_source, end_time=None, frame_skip=0, show_progress (bool): If True, and the ``tqdm`` module is available, displays a progress bar with the progress, framerate, and expected time to complete processing the video frame source. + callback ((image_ndarray, frame_num: int) -> None): If not None, called after each scene/event detected. Returns: int: Number of frames read and processed from the frame source. Raises: @@ -600,7 +607,7 @@ def detect_scenes(self, frame_source, end_time=None, frame_skip=0, if not ret_val: break - self._process_frame(self._num_frames + start_frame, frame_im) + self._process_frame(self._num_frames + start_frame, frame_im, callback) curr_frame += 1 self._num_frames += 1