add camera level ffmpeg params

This commit is contained in:
Blake Blackshear 2021-02-05 07:22:33 -06:00
parent d3524ee46f
commit d51e9446ff
3 changed files with 73 additions and 7 deletions

View File

@ -229,7 +229,12 @@ cameras:
hwaccel_args: hwaccel_args:
# Optional: stream specific input args (default: inherit) # Optional: stream specific input args (default: inherit)
input_args: 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) # Optional: camera specific output args (default: inherit)
output_args: output_args:

View File

@ -164,6 +164,9 @@ CAMERA_FFMPEG_SCHEMA = vol.Schema(
'input_args': vol.Any(str, [str]), 'input_args': vol.Any(str, [str]),
}], vol.Msg(each_role_used_once, msg="Each input role may only be used once"), }], 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")), 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': { 'output_args': {
vol.Optional('detect', default=DETECT_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]), 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]), vol.Optional('record', default=RECORD_FFMPEG_OUTPUT_ARGS_DEFAULT): vol.Any(str, [str]),
@ -392,12 +395,12 @@ class MqttConfig():
} }
class CameraInput(): class CameraInput():
def __init__(self, global_config, ffmpeg_input): def __init__(self, camera_config, global_config, ffmpeg_input):
self._path = ffmpeg_input['path'] self._path = ffmpeg_input['path']
self._roles = ffmpeg_input['roles'] self._roles = ffmpeg_input['roles']
self._global_args = ffmpeg_input.get('global_args', global_config['global_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', global_config['hwaccel_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', global_config['input_args']) self._input_args = ffmpeg_input.get('input_args', camera_config.get('input_args', global_config['input_args']))
@property @property
def path(self): def path(self):
@ -421,7 +424,7 @@ class CameraInput():
class CameraFfmpegConfig(): class CameraFfmpegConfig():
def __init__(self, global_config, config): 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']) self._output_args = config.get('output_args', global_config['output_args'])
@property @property

View File

@ -160,7 +160,7 @@ class TestConfig(TestCase):
assert('dog' in frigate_config.cameras['back'].objects.filters) assert('dog' in frigate_config.cameras['back'].objects.filters)
assert(frigate_config.cameras['back'].objects.filters['dog'].threshold == 0.7) assert(frigate_config.cameras['back'].objects.filters['dog'].threshold == 0.7)
def test_ffmpeg_params(self): def test_ffmpeg_params_global(self):
config = { config = {
'ffmpeg': { 'ffmpeg': {
'input_args': ['-re'] 'input_args': ['-re']
@ -191,6 +191,64 @@ class TestConfig(TestCase):
frigate_config = FrigateConfig(config=config) frigate_config = FrigateConfig(config=config)
assert('-re' in frigate_config.cameras['back'].ffmpeg_cmds[0]['cmd']) 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): def test_inherit_clips_retention(self):
config = { config = {
'mqtt': { 'mqtt': {