diff --git a/frigate/ptz/onvif.py b/frigate/ptz/onvif.py index 8aae216f1a..a7a2cd68b5 100644 --- a/frigate/ptz/onvif.py +++ b/frigate/ptz/onvif.py @@ -67,21 +67,55 @@ def _init_onvif(self, camera_name: str) -> bool: # create init services media = onvif.create_media_service() + logger.debug(f"Onvif media xaddr for {camera_name}: {media.xaddr}") try: # this will fire an exception if camera is not a ptz capabilities = onvif.get_definition("ptz") logger.debug(f"Onvif capabilities for {camera_name}: {capabilities}") - profile = media.GetProfiles()[0] except (ONVIFError, Fault, TransportError) as e: - logger.error(f"Unable to connect to camera: {camera_name}: {e}") + logger.error( + f"Unable to get Onvif capabilities for camera: {camera_name}: {e}" + ) return False - ptz = onvif.create_ptz_service() + try: + profiles = media.GetProfiles() + except (ONVIFError, Fault, TransportError) as e: + logger.error( + f"Unable to get Onvif media profiles for camera: {camera_name}: {e}" + ) + return False + + profile = None + for key, onvif_profile in enumerate(profiles): + if ( + onvif_profile.VideoEncoderConfiguration + and onvif_profile.VideoEncoderConfiguration.Encoding == "H264" + ): + profile = onvif_profile + logger.debug(f"Selected Onvif profile for {camera_name}: {profile}") + break + + if profile is None: + logger.error( + f"No appropriate Onvif profiles found for camera: {camera_name}." + ) + return False + + # get the PTZ config for the profile + try: + configs = profile.PTZConfiguration + logger.debug( + f"Onvif ptz config for media profile in {camera_name}: {configs}" + ) + except Exception as e: + logger.error( + f"Invalid Onvif PTZ configuration for camera: {camera_name}: {e}" + ) + return False - # get the PTZ config for the first onvif profile - configs = profile.PTZConfiguration - logger.debug(f"Onvif ptz config for media profile in {camera_name}: {configs}") + ptz = onvif.create_ptz_service() request = ptz.create_type("GetConfigurationOptions") request.ConfigurationToken = profile.PTZConfiguration.token