当前位置:   article > 正文

python 通过ONVIF控制IPC_python onvif

python onvif

一、ONVIF介绍

  1. 什么是ONVIF
  2. ONVIF的功能特点

二、使用Python来控制IPC

  1. Python的环境搭建
  2. 使用Python通过ONVIF Get和Set IPC参数

三、总结

  1. ONVIF的功能特点
  2. 使用Python来控制IPC的步骤
  3. 总结Python控制ONVIF的技术优势

一、ONVIF介绍

什么是ONVIF

ONVIF(Open Network Video Interface Forum)是一个开放的网络视频接口标准,旨在实现视频设备之间的互操作性。该标准由英特尔、英伟达、芬兰萨里大学、索尼、施乐等设备制造商组成,于2008年组建了ONVIF联盟,致力于制定一种标准,让网络视频摄像头、视频服务器、IP卡等设备可以通过ONVIF协议进行通信。

ONVIF的功能特点

ONVIF协议定义了一种标准的网络视频接口,其主要功能包括:设备发现、视频流控制、媒体控制、事件处理、访问控制等。这些功能可以让ONVIF接口的设备能够在同一个网络上互相通信,提供更好的视频监控体验。

ONVIF协议的另一个优势是使用简单,可以让不同厂家的设备通过ONVIF协议进行通信,而无需进行其他安装和调整工作。另外,ONVIF协议还可以方便地通过网络视频管理软件来管理多台ONVIF接口的设备,大大提高了视频监控的便利性和灵活性。

ONVIF标准是目前业界监控领域中使用最为广泛的网络视频接口标准,它的出现和普及大大提高了视频监控的便利性和效率,让视频监控技术发挥出更大的作用。

二、使用Python来控制IPC

Python的环境搭建

  1. 运行命令 pip install onvif2-zeep 。

  2. 如果有错误,请确保您的pip版本最新。

  3. 如果安装成功,可以在python控制台中尝试以下语句:

    from onvif import ONVIFCamera

  4. 如果没有报错,则安装成功!

  5. 安装完成后需要下载更新wsdl,访问

    https://github.com/yingchengpa/python-onvif2-zeep 将wsdl中的文件更新到.\venv\Lib\site-packages\wsdl中。更新完成后结构如下
    ├─ver10                     
    │  ├─accesscontrol          
    │  │  └─wsdl                
    │  ├─accessrules            
    │  │  └─wsdl                
    │  ├─advancedsecurity       
    │  │  └─wsdl
    │  ├─schema
    │  ├─thermal
    │  │  └─wsdl
    │  ├─topics
    │  └─uplink
    │      └─wsdl
    └─ver20
        ├─analytics
        │  └─wsdl
        ├─imaging
        │  └─wsdl
        ├─media
        │  └─wsdl
        ├─ptz
        │  └─wsdl
        └─util
    

使用Python通过ONVIF Get和Set IPC参数

在onvif2-zeep中,部分方法和参数无法进行补全提示,具体使用方法请参见/wsdl/ver20/media/wsdl/media.wsdl中的配置:

例如我在实现GetVideoEncoderConfigurations时,参考的就是/wsdl/ver20/media/wsdl/media.wsdl中如下代码

  1. <xs:element name="GetVideoEncoderConfigurations" type="tr2:GetConfiguration"/>
  2. <xs:element name="GetVideoEncoderConfigurationsResponse">
  3. <xs:complexType>
  4. <xs:sequence>
  5. <xs:element name="Configurations" type="tt:VideoEncoder2Configuration" minOccurs="0" maxOccurs="unbounded">
  6. <xs:annotation>
  7. <xs:documentation>This element contains a list of video encoder configurations.</xs:documentation>
  8. </xs:annotation>
  9. </xs:element>
  10. </xs:sequence>
  11. </xs:complexType>
  12. </xs:element>

返回的配置文件一般是一个json格式的对象,我们在编辑后可以再set回去。同样我会参考如下代码

  1. <xs:element name="SetVideoEncoderConfiguration">
  2. <xs:complexType>
  3. <xs:sequence>
  4. <xs:element name="Configuration" type="tt:VideoEncoder2Configuration">
  5. <xs:annotation>
  6. <xs:documentation>Contains the modified video encoder configuration. The configuration shall exist in the device.</xs:documentation>
  7. </xs:annotation>
  8. </xs:element>
  9. </xs:sequence>
  10. </xs:complexType>
  11. </xs:element>
  12. <xs:complexType name="SetConfigurationResponse">
  13. <xs:sequence>
  14. </xs:sequence>
  15. </xs:complexType>

同理,其他功能可以通过参考wsdl文件进行调用。

三、总结

ONVIF的功能特点

通过调用ONVIF可以达到对设备进行配置,控制,拉流,截图等的调用。结

使用Python来控制IPC的步骤

  1. from onvif2 import ONVIFCamera, ONVIFError
  2. '''
  3. when use onvif2, you should install onvif2-zeep first
  4. and download wsdl file from github:https://github.com/yingchengpa/python-onvif2-zeep.
  5. then, set wsdl_dir to the path of wsdl file.
  6. '''
  7. class IPC():
  8. def __init__(self, host, port, user, passwd):
  9. self.device = ONVIFCamera(host, port, user, passwd,
  10. wsdl_dir=r'D:\tsing\511\workspace\IPC_scanner\venv\Lib\site-packages\wsdl')
  11. self.media2_service = self.device.create_media2_service()
  12. def GetIPCInfo(self):
  13. self.sourcecfg = self.GetVideoSourceConfigurations()
  14. self.encodercfg = self.GetVideoEncoderConfigurations()
  15. self.profiles = self.GetProfiles()
  16. self.osds = self.GetOSDs()
  17. self.info = self.GetDeviceInformation()
  18. return {
  19. 'sourcecfg': self.sourcecfg,
  20. 'encodercfg': self.encodercfg,
  21. 'profiles': self.profiles,
  22. 'osds': self.osds,
  23. 'info': self.info
  24. }
  25. def SetIPCInfo(self, ratio=(1920, 1080), Encoding='H265', bitrate=2048, fps=25, gop=50):
  26. if ratio[0] > self.sourcecfg[0]['Bounds']['width']:
  27. raise ONVIFError(f'ratio Error: max width should less then {self.sourcecfg[0]["Bounds"]["width"]}')
  28. if ratio[1] > self.sourcecfg[1]['Bounds']['height']:
  29. raise ONVIFError(f'ratio Error: max height should less then {self.sourcecfg[0]["Bounds"]["height"]}')
  30. if Encoding.upper() not in ('H265', 'H264'):
  31. raise ONVIFError(f'encoding Error: enconding format should be "H265" or "H264"')
  32. self.encodercfg[0]['Resolution']['Width'] = ratio[0]
  33. self.encodercfg[0]['Resolution']['Height'] = ratio[1]
  34. self.encodercfg[0]['Encoding'] = Encoding.upper()
  35. self.encodercfg[0]['RateControl']['FrameRateLimit'] = float(fps)
  36. self.encodercfg[0]['RateControl']['BitrateLimit'] = bitrate
  37. self.encodercfg[0]['GovLength'] = gop
  38. return self.SetVideoEncoderConfigurations(self.encodercfg)
  39. def GetDeviceInformation(self):
  40. info = self.device.devicemgmt.GetDeviceInformation()
  41. return info
  42. def GetVideoSourceConfigurations(self):
  43. sourceConfigurations = self.media2_service.GetVideoSourceConfigurations()
  44. return sourceConfigurations
  45. def GetVideoEncoderConfigurations(self):
  46. configurations = self.media2_service.GetVideoEncoderConfigurations()
  47. return configurations
  48. def SetVideoEncoderConfigurations(self, conf):
  49. try:
  50. self.media2_service.SetVideoEncoderConfiguration(conf)
  51. return True
  52. except:
  53. return False
  54. def GetProfiles(self):
  55. profiles = self.media2_service.GetProfiles()
  56. return profiles
  57. def GetOSDs(self):
  58. osds = self.media2_service.GetOSDs()
  59. return osds
  60. def GetStreamUri(self):
  61. return self.media2_service.GetStreamUri()
  62. if __name__ == '__main__':
  63. host = '192.168.1.51'
  64. port = 80
  65. user = 'onvif'
  66. passwd = '*****'
  67. device = IPC(host, port, user, passwd)
  68. print('GetVideoSourceConfigurations', device.GetVideoSourceConfigurations())
  69. print('---------------')
  70. print('GetVideoEncoderConfigurations', device.GetVideoEncoderConfigurations())
  71. print('---------------')
  72. print('GetProfiles', device.GetProfiles())
  73. print('---------------')
  74. print('GetOSDs', device.GetOSDs())
  75. print('---------------')
  76. print('GetDeviceInformation', device.GetDeviceInformation())
  77. # should be get configurations before set.
  78. device.SetIPCInfo(ratio=(3840, 2160), Encoding='H264', bitrate=4096, fps=20, gop=30)

总结Python控制ONVIF的技术优势

通过python 控制ONVIF,适用于多设备的监控,调试,巡查等。减少了逐一操作的时间成本。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/628430
推荐阅读
相关标签
  

闽ICP备14008679号