赞
踩
一、ONVIF介绍
二、使用Python来控制IPC
三、总结
ONVIF(Open Network Video Interface Forum)是一个开放的网络视频接口标准,旨在实现视频设备之间的互操作性。该标准由英特尔、英伟达、芬兰萨里大学、索尼、施乐等设备制造商组成,于2008年组建了ONVIF联盟,致力于制定一种标准,让网络视频摄像头、视频服务器、IP卡等设备可以通过ONVIF协议进行通信。
ONVIF协议定义了一种标准的网络视频接口,其主要功能包括:设备发现、视频流控制、媒体控制、事件处理、访问控制等。这些功能可以让ONVIF接口的设备能够在同一个网络上互相通信,提供更好的视频监控体验。
ONVIF协议的另一个优势是使用简单,可以让不同厂家的设备通过ONVIF协议进行通信,而无需进行其他安装和调整工作。另外,ONVIF协议还可以方便地通过网络视频管理软件来管理多台ONVIF接口的设备,大大提高了视频监控的便利性和灵活性。
ONVIF标准是目前业界监控领域中使用最为广泛的网络视频接口标准,它的出现和普及大大提高了视频监控的便利性和效率,让视频监控技术发挥出更大的作用。
运行命令 pip install onvif2-zeep
。
如果有错误,请确保您的pip版本最新。
如果安装成功,可以在python控制台中尝试以下语句:
from onvif import ONVIFCamera
如果没有报错,则安装成功!
安装完成后需要下载更新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
在onvif2-zeep中,部分方法和参数无法进行补全提示,具体使用方法请参见/wsdl/ver20/media/wsdl/media.wsdl中的配置:
例如我在实现GetVideoEncoderConfigurations时,参考的就是/wsdl/ver20/media/wsdl/media.wsdl中如下代码
- <xs:element name="GetVideoEncoderConfigurations" type="tr2:GetConfiguration"/>
- <xs:element name="GetVideoEncoderConfigurationsResponse">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="Configurations" type="tt:VideoEncoder2Configuration" minOccurs="0" maxOccurs="unbounded">
- <xs:annotation>
- <xs:documentation>This element contains a list of video encoder configurations.</xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
返回的配置文件一般是一个json格式的对象,我们在编辑后可以再set回去。同样我会参考如下代码
- <xs:element name="SetVideoEncoderConfiguration">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="Configuration" type="tt:VideoEncoder2Configuration">
- <xs:annotation>
- <xs:documentation>Contains the modified video encoder configuration. The configuration shall exist in the device.</xs:documentation>
- </xs:annotation>
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- <xs:complexType name="SetConfigurationResponse">
- <xs:sequence>
- </xs:sequence>
- </xs:complexType>
同理,其他功能可以通过参考wsdl文件进行调用。
通过调用ONVIF可以达到对设备进行配置,控制,拉流,截图等的调用。结
- from onvif2 import ONVIFCamera, ONVIFError
-
- '''
- when use onvif2, you should install onvif2-zeep first
- and download wsdl file from github:https://github.com/yingchengpa/python-onvif2-zeep.
- then, set wsdl_dir to the path of wsdl file.
- '''
-
-
- class IPC():
- def __init__(self, host, port, user, passwd):
- self.device = ONVIFCamera(host, port, user, passwd,
- wsdl_dir=r'D:\tsing\511\workspace\IPC_scanner\venv\Lib\site-packages\wsdl')
- self.media2_service = self.device.create_media2_service()
-
- def GetIPCInfo(self):
- self.sourcecfg = self.GetVideoSourceConfigurations()
- self.encodercfg = self.GetVideoEncoderConfigurations()
- self.profiles = self.GetProfiles()
- self.osds = self.GetOSDs()
- self.info = self.GetDeviceInformation()
- return {
- 'sourcecfg': self.sourcecfg,
- 'encodercfg': self.encodercfg,
- 'profiles': self.profiles,
- 'osds': self.osds,
- 'info': self.info
- }
-
- def SetIPCInfo(self, ratio=(1920, 1080), Encoding='H265', bitrate=2048, fps=25, gop=50):
- if ratio[0] > self.sourcecfg[0]['Bounds']['width']:
- raise ONVIFError(f'ratio Error: max width should less then {self.sourcecfg[0]["Bounds"]["width"]}')
- if ratio[1] > self.sourcecfg[1]['Bounds']['height']:
- raise ONVIFError(f'ratio Error: max height should less then {self.sourcecfg[0]["Bounds"]["height"]}')
- if Encoding.upper() not in ('H265', 'H264'):
- raise ONVIFError(f'encoding Error: enconding format should be "H265" or "H264"')
- self.encodercfg[0]['Resolution']['Width'] = ratio[0]
- self.encodercfg[0]['Resolution']['Height'] = ratio[1]
- self.encodercfg[0]['Encoding'] = Encoding.upper()
- self.encodercfg[0]['RateControl']['FrameRateLimit'] = float(fps)
- self.encodercfg[0]['RateControl']['BitrateLimit'] = bitrate
- self.encodercfg[0]['GovLength'] = gop
-
- return self.SetVideoEncoderConfigurations(self.encodercfg)
-
- def GetDeviceInformation(self):
- info = self.device.devicemgmt.GetDeviceInformation()
- return info
-
- def GetVideoSourceConfigurations(self):
- sourceConfigurations = self.media2_service.GetVideoSourceConfigurations()
- return sourceConfigurations
-
- def GetVideoEncoderConfigurations(self):
- configurations = self.media2_service.GetVideoEncoderConfigurations()
- return configurations
-
- def SetVideoEncoderConfigurations(self, conf):
- try:
- self.media2_service.SetVideoEncoderConfiguration(conf)
- return True
- except:
- return False
-
- def GetProfiles(self):
- profiles = self.media2_service.GetProfiles()
- return profiles
-
- def GetOSDs(self):
- osds = self.media2_service.GetOSDs()
- return osds
-
- def GetStreamUri(self):
- return self.media2_service.GetStreamUri()
-
-
- if __name__ == '__main__':
- host = '192.168.1.51'
- port = 80
- user = 'onvif'
- passwd = '*****'
- device = IPC(host, port, user, passwd)
- print('GetVideoSourceConfigurations', device.GetVideoSourceConfigurations())
- print('---------------')
- print('GetVideoEncoderConfigurations', device.GetVideoEncoderConfigurations())
- print('---------------')
- print('GetProfiles', device.GetProfiles())
- print('---------------')
- print('GetOSDs', device.GetOSDs())
- print('---------------')
- print('GetDeviceInformation', device.GetDeviceInformation())
- # should be get configurations before set.
- device.SetIPCInfo(ratio=(3840, 2160), Encoding='H264', bitrate=4096, fps=20, gop=30)
通过python 控制ONVIF,适用于多设备的监控,调试,巡查等。减少了逐一操作的时间成本。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。