diff --git a/frigate/video/detect.py b/frigate/video/detect.py index d1048e4270..f55c1c9635 100644 --- a/frigate/video/detect.py +++ b/frigate/video/detect.py @@ -144,6 +144,11 @@ class CameraTracker(FrigateProcess): def run(self) -> None: self.pre_run_setup(self.log_config) + + # OpenCV only sees small images here, and its default per-core thread + # pool burns ~5x the CPU of running them inline + cv2.setNumThreads(1) + frame_queue = self.camera_metrics.frame_queue frame_shape = self.config.frame_shape diff --git a/frigate/video/ffmpeg.py b/frigate/video/ffmpeg.py index c4364f8d71..16e3afcdb5 100644 --- a/frigate/video/ffmpeg.py +++ b/frigate/video/ffmpeg.py @@ -79,7 +79,8 @@ def capture_frames( frame_name = f"{config.name}_frame{frame_index}" frame_buffer = frame_manager.write(frame_name) try: - frame_buffer[:] = ffmpeg_process.stdout.read(frame_size) + if ffmpeg_process.stdout.readinto(frame_buffer) != frame_size: + raise EOFError("incomplete frame") except Exception: # shutdown has been initiated if stop_event.is_set():