From ce3a544ecd1eeca31439b8e8c8f922ebc7a8c628 Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Fri, 14 Jul 2023 14:56:03 +0300 Subject: [PATCH] Feature: automatic camera resolution configuration (#6810) * Add auto configuration for height, width and fps in detect role * Add auto-configuration for detect width, height, and fps for input roles with detect in the CameraConfig class in config.py * Refactor code to retrieve video properties from input stream in CameraConfig class and add optional parameter to retrieve video duration in get_video_properties function * format * Set default detect dimensions to 1280x720 and update DetectConfig to use the defaults * Revert "Set default detect dimensions to 1280x720 and update DetectConfig to use the defaults" This reverts commit a1aed0414d75a6db0a826c08359740764c4861e5. * Add default detect dimensions if autoconfiguration failed and log a warning message * fix warn message spelling on frigate/config.py Co-authored-by: Nicolas Mowen * Ensure detect height and width are not None before using them in camera configuration * docs: initial commit * rename streamInfo to stream_info Co-authored-by: Blake Blackshear * Apply suggestions from code review Co-authored-by: Nicolas Mowen * Update docs * handle case then get_video_properties returns 0x0 dimension * Set detect resolution based on stream properties if available, else apply default values * Update FrigateConfig to set default values for stream_info if resolution detection fails * Update camera detection dimensions based on stream information if available --------- Co-authored-by: Nicolas Mowen Co-authored-by: Blake Blackshear --- docs/docs/configuration/camera_specific.md | 4 +-- docs/docs/configuration/cameras.md | 4 +-- docs/docs/configuration/index.md | 3 -- docs/docs/development/contributing.md | 4 --- docs/docs/guides/getting_started.md | 5 ---- frigate/config.py | 32 ++++++++++++++++++++-- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/docs/docs/configuration/camera_specific.md b/docs/docs/configuration/camera_specific.md index 09b3fe01f..c191d8333 100644 --- a/docs/docs/configuration/camera_specific.md +++ b/docs/docs/configuration/camera_specific.md @@ -80,8 +80,8 @@ cameras: rtmp: enabled: False # <-- RTMP should be disabled if your stream is not H264 detect: - width: # <---- update for your camera's resolution - height: # <---- update for your camera's resolution + width: # <- optional, by default Frigate tries to automatically detect resolution + height: # <- optional, by default Frigate tries to automatically detect resolution ``` ### Blue Iris RTSP Cameras diff --git a/docs/docs/configuration/cameras.md b/docs/docs/configuration/cameras.md index 1804003a5..cc699f254 100644 --- a/docs/docs/configuration/cameras.md +++ b/docs/docs/configuration/cameras.md @@ -33,8 +33,8 @@ cameras: roles: - record detect: - width: 1280 - height: 720 + width: 1280 # <- optional, by default Frigate tries to automatically detect resolution + height: 720 # <- optional, by default Frigate tries to automatically detect resolution ``` Additional cameras are simply added to the config under the `cameras` entry. diff --git a/docs/docs/configuration/index.md b/docs/docs/configuration/index.md index d00d1d1d6..c4be86db0 100644 --- a/docs/docs/configuration/index.md +++ b/docs/docs/configuration/index.md @@ -19,9 +19,6 @@ cameras: - path: rtsp://viewer:{FRIGATE_RTSP_PASSWORD}@10.0.10.10:554/cam/realmonitor?channel=1&subtype=2 roles: - detect - detect: - width: 1280 - height: 720 ``` ### VSCode Configuration Schema diff --git a/docs/docs/development/contributing.md b/docs/docs/development/contributing.md index 0955af56a..4ea6b6255 100644 --- a/docs/docs/development/contributing.md +++ b/docs/docs/development/contributing.md @@ -68,10 +68,6 @@ cameras: input_args: -re -stream_loop -1 -fflags +genpts roles: - detect - detect: - height: 1080 - width: 1920 - fps: 5 ``` These input args tell ffmpeg to read the mp4 file in an infinite loop. You can use any valid ffmpeg input here. diff --git a/docs/docs/guides/getting_started.md b/docs/docs/guides/getting_started.md index cb67c59b4..9f0cbcbb4 100644 --- a/docs/docs/guides/getting_started.md +++ b/docs/docs/guides/getting_started.md @@ -22,8 +22,6 @@ cameras: - detect detect: enabled: False # <---- disable detection until you have a working camera feed - width: 1280 # <---- update for your camera's resolution - height: 720 # <---- update for your camera's resolution ``` ### Step 2: Start Frigate @@ -105,9 +103,6 @@ cameras: - path: rtsp://10.0.10.10:554/rtsp roles: - detect - detect: - width: 1280 - height: 720 motion: mask: - 0,461,3,0,1919,0,1919,843,1699,492,1344,458,1346,336,973,317,869,375,866,432 diff --git a/frigate/config.py b/frigate/config.py index 11ef1b9ee..c014b464c 100644 --- a/frigate/config.py +++ b/frigate/config.py @@ -26,6 +26,7 @@ from frigate.util.builtin import ( deep_merge, escape_special_characters, get_ffmpeg_arg_list, + get_video_properties, load_config_with_no_duplicates, ) from frigate.util.image import create_mask @@ -42,6 +43,7 @@ FRIGATE_ENV_VARS = {k: v for k, v in os.environ.items() if k.startswith("FRIGATE DEFAULT_TRACKED_OBJECTS = ["person"] DEFAULT_LISTEN_AUDIO = ["bark", "speech", "yell", "scream"] DEFAULT_DETECTORS = {"cpu": {"type": "cpu"}} +DEFAULT_DETECT_DIMENSIONS = {"width": 1280, "height": 720} class FrigateBaseModel(BaseModel): @@ -284,8 +286,8 @@ class StationaryConfig(FrigateBaseModel): class DetectConfig(FrigateBaseModel): - height: int = Field(default=720, title="Height of the stream for the detect role.") - width: int = Field(default=1280, title="Width of the stream for the detect role.") + height: Optional[int] = Field(title="Height of the stream for the detect role.") + width: Optional[int] = Field(title="Width of the stream for the detect role.") fps: int = Field( default=5, title="Number of frames per second to process through detection." ) @@ -1020,6 +1022,32 @@ class FrigateConfig(FrigateBaseModel): {"name": name, **merged_config} ) + if ( + camera_config.detect.height is None + or camera_config.detect.width is None + ): + for input in camera_config.ffmpeg.inputs: + if "detect" in input.roles: + stream_info = {"width": 0, "height": 0} + try: + stream_info = get_video_properties(input.path) + except Exception: + logger.warn( + f"Error detecting stream resolution automatically for {input.path} Applying default values." + ) + stream_info = {"width": 0, "height": 0} + + camera_config.detect.width = ( + stream_info["width"] + if stream_info.get("width") + else DEFAULT_DETECT_DIMENSIONS["width"] + ) + camera_config.detect.height = ( + stream_info["height"] + if stream_info.get("height") + else DEFAULT_DETECT_DIMENSIONS["height"] + ) + # Default max_disappeared configuration max_disappeared = camera_config.detect.fps * 5 if camera_config.detect.max_disappeared is None: