一、ONVIF介绍
- 什么是ONVIF
- ONVIF的功能特点
二、使用Python来控制IPC
- Python的环境搭建
- 使用Python通过ONVIF Get和Set IPC参数
三、总结
- ONVIF的功能特点
- 使用Python来控制IPC的步骤
- 总结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的环境搭建
-
运行命令
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
使用Python通过ONVIF Get和Set IPC参数
在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的功能特点
通过调用ONVIF可以达到对设备进行配置,控制,拉流,截图等的调用。结
使用Python来控制IPC的步骤
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的技术优势
通过python 控制ONVIF,适用于多设备的监控,调试,巡查等。减少了逐一操作的时间成本。