浏览代码

add camera level ffmpeg params

Blake Blackshear 4 年之前
父节点
当前提交
d51e9446ff
共有 3 个文件被更改,包括 73 次插入7 次删除
  1. 6 1
      docs/docs/configuration/cameras.md
  2. 8 5
      frigate/config.py
  3. 59 1
      frigate/test/test_config.py

+ 6 - 1
docs/docs/configuration/cameras.md

@@ -229,7 +229,12 @@ cameras:
           hwaccel_args:
           # Optional: stream specific input args (default: inherit)
           input_args:
-
+      # Optional: camera specific global args (default: inherit)
+      global_args:
+      # Optional: camera specific hwaccel args (default: inherit)
+      hwaccel_args:
+      # Optional: camera specific input args (default: inherit)
+      input_args:
       # Optional: camera specific output args (default: inherit)
       output_args:
 

+ 8 - 5
frigate/config.py

@@ -164,6 +164,9 @@ CAMERA_FFMPEG_SCHEMA = vol.Schema(
             'input_args': vol.Any(str, [str]),
         }], vol.Msg(each_role_used_once, msg="Each input role may only be used once"), 
             vol.Msg(detect_is_required, msg="The detect role is required")),
+        'global_args':  vol.Any(str, [str]),
+        'hwaccel_args': vol.Any(str, [str]),
+        'input_args': vol.Any(str, [str]),
         'output_args': {
             vol.Optional('detect', default=DETECT_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]),
             vol.Optional('record', default=RECORD_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]),
@@ -392,12 +395,12 @@ class MqttConfig():
         }
 
 class CameraInput():
-    def __init__(self, global_config, ffmpeg_input):
+    def __init__(self, camera_config, global_config, ffmpeg_input):
         self._path = ffmpeg_input['path']
         self._roles = ffmpeg_input['roles']
-        self._global_args = ffmpeg_input.get('global_args', global_config['global_args'])
-        self._hwaccel_args = ffmpeg_input.get('hwaccel_args', global_config['hwaccel_args'])
-        self._input_args = ffmpeg_input.get('input_args', global_config['input_args'])
+        self._global_args = ffmpeg_input.get('global_args', camera_config.get('global_args', global_config['global_args']))
+        self._hwaccel_args = ffmpeg_input.get('hwaccel_args', camera_config.get('hwaccel_args', global_config['hwaccel_args']))
+        self._input_args = ffmpeg_input.get('input_args', camera_config.get('input_args', global_config['input_args']))
 
     @property
     def path(self):
@@ -421,7 +424,7 @@ class CameraInput():
 
 class CameraFfmpegConfig():
     def __init__(self, global_config, config):
-        self._inputs = [CameraInput(global_config, i) for i in config['inputs']]
+        self._inputs = [CameraInput(config, global_config, i) for i in config['inputs']]
         self._output_args = config.get('output_args', global_config['output_args'])
 
     @property

+ 59 - 1
frigate/test/test_config.py

@@ -160,7 +160,7 @@ class TestConfig(TestCase):
         assert('dog' in frigate_config.cameras['back'].objects.filters)
         assert(frigate_config.cameras['back'].objects.filters['dog'].threshold == 0.7)
     
-    def test_ffmpeg_params(self):
+    def test_ffmpeg_params_global(self):
         config = {
             'ffmpeg': {
                 'input_args': ['-re']
@@ -190,6 +190,64 @@ class TestConfig(TestCase):
         }
         frigate_config = FrigateConfig(config=config)
         assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd'])
+
+    def test_ffmpeg_params_camera(self):
+        config = {
+            'mqtt': {
+                'host': 'mqtt'
+            },
+            'cameras': {
+                'back': {
+                    'ffmpeg': {
+                        'inputs': [
+                            { 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'] }
+                        ],
+                        'input_args': ['-re']
+                    },
+                    'height': 1080,
+                    'width': 1920,
+                    'objects': {
+                        'track': ['person', 'dog'],
+                        'filters': {
+                            'dog': {
+                                'threshold': 0.7
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        frigate_config = FrigateConfig(config=config)
+        assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd'])
+
+    def test_ffmpeg_params_input(self):
+        config = {
+            'mqtt': {
+                'host': 'mqtt'
+            },
+            'cameras': {
+                'back': {
+                    'ffmpeg': {
+                        'inputs': [
+                            { 'path': 'rtsp://10.0.0.1:554/video', 'roles': ['detect'], 'input_args': ['-re'] }
+                        ]
+                    },
+                    'height': 1080,
+                    'width': 1920,
+                    'objects': {
+                        'track': ['person', 'dog'],
+                        'filters': {
+                            'dog': {
+                                'threshold': 0.7
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        frigate_config = FrigateConfig(config=config)
+        assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd'])
+    
     
     def test_inherit_clips_retention(self):
         config = {