最近由于工作需要,需要用ONVIF来快速验证一个想法,发现在Python下验证还蛮方便的,但是也遇到了一些问题,在这里总结一下,如有有缘人看见,或许可以节约一些时间。
目录
一、Python对接onvif的工具
二、Onvif快速用起来
三、使用原理简析
使用python-onvif,但需要注意一点,不同python版本使用的python-onvif包是不一样的,不注意的话会安装失败。
Python 2.x:python-onvifGitHub - quatanium/python-onvif at 09ffc65b8cd9d141b6a386804e7af7028755034ehttps://github.com/quatanium/python-onvif/tree/09ffc65b8cd9d141b6a386804e7af7028755034e Python 3.x:python-onvif-zeep
GitHub - FalkTannhaeuser/python-onvif-zeep: ONVIF Client Implementation in Python 2+3 (using https://github.com/mvantellingen/python-zeep instead of suds as SOAP client)ONVIF Client Implementation in Python 2+3 (using https://github.com/mvantellingen/python-zeep instead of suds as SOAP client) - GitHub - FalkTannhaeuser/python-onvif-zeep: ONVIF Client Implementation in Python 2+3 (using https://github.com/mvantellingen/python-zeep instead of suds as SOAP client)https://github.com/FalkTannhaeuser/python-onvif-zeep 我是3.7,直接敲下面这行即可。
pip install --upgrade onvif_zeep
首先需要说明一下,Onvif是用来控制和配置相机的,不能看视频流。看视频流要通过RTSP等其它技术。如果你既想看(视频流),又想控(摄像头),那要两项技术都要用起来才行。
这篇博文的代码,通过onvif达到控制相机截图、移动到预置点、PTZ控制的功能,已验证,可以顺利跑通,对于新手很好用,但是对新手来说没有写完整,下面我会补充:
Python3-onvif协议之相机截图、相机获取预置点、移动到预置点 - 简书安装模块 前提准备:1:相机支持onvif协议并已打开此功能2:创建onvif协议下的账号和密码,用此账号来登录下面的方法 获取截图 相关链接:官方onvif协议API:ht...https://www.jianshu.com/p/5f58fa190340 在上面的博文里,博主定义了:
class Onvif_hik(object):
但单靠这些程序是跑不起来的。想要把 Onvif_hik用起来,还需要在代码最底下加一句主程序入口:
if __name__ == "__main__":
cam = Onvif_hik('192.168.xx.xx', '用户名', '密码')
cam.content_cam()
cam.zoom(-0.5,5) ###调用功能函数,摄像机以-0.5的速度变焦,持续5秒。
这样一运行,程序就跑起来了,你会发现摄像机开始变焦了,可以改给zoom的参数来实现你需要的功能。
到此,我们顺利地把onvif用起来了。
我们将ONVIF这一段的代码做简要说明。
class Onvif_orl(object): ###类名可根据实际修改
def __init__(self, ip: str, username: str, password: str):
self.ip = ip
self.username = username
self.password = password
zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
self.save_path = "./{}T{}.jpg".format(self.ip, str(time.time())) # 截图保存路径
def content_cam(self):
"""
链接相机地址
:return:
"""
try:
self.mycam = ONVIFCamera(self.ip, 80, self.username, self.password)
self.media = self.mycam.create_media_service() # 创建媒体服务
self.media_profile = self.media.GetProfiles()[0] # 获取配置信息
self.ptz = self.mycam.create_ptz_service() # 创建控制台服务
return True
except Exception as e:
return False
def zoom(self, zoom_speed: str, lasting: int = 0.1):
"""
变焦
:param zoom_speed: 变焦速度
:param lasting: 生效时间
:return:
"""
request = self.ptz.create_type('ContinuousMove')
request.ProfileToken = self.media_profile.token
request.Velocity = {"Zoom": zoom_speed}
self.ptz.ContinuousMove(request)
time.sleep(lasting)
self.ptz.Stop({'ProfileToken': request.ProfileToken})
__init__(self, ip: str, username: str, password: str)是Onvif_orl()的初始化,要传IP、用户名、密码等进去。
content_cam(self)在__init__之后,初始化我们需要的服务,例如我们用到onvif的ptz功能,就需要这样:
self.ptz = self.mycam.create_ptz_service()
然后就可以在zoom()里面定义具体功能,最后在主函数里引用zoom()即可用起来了。(例如:cam.zoom(-0.5,5))
Onvif的其它功能使用大体上也是参考此办法即可,即,先初始化基本参数,再创建服务,最后调用使用。
至于Onvif的其它功能都有哪些,可参考官网:
http://www.onvif.org/onvif/ver20/util/operationIndex.htmlhttp://www.onvif.org/onvif/ver20/util/operationIndex.html
这里需要注意两点:
1.上面的官网页面,没有罗列完整的ONVIF功能,点进次级页面后,会有更多onvif功能写在里面。
我一开始就没有找到我要的功能,以为是onvif没有,后来点进去后才发现。
2. 英文版的页面看起来费力的话,可以搜《ONVIF2.0协议珍藏版》,是中文的。
以PTZ控制为例,ONVIF用起来基本都是这流程,相信大家没有问题的。
接下来更多、更复杂、更花哨、更激动人心的功能就凭大家自由发挥啦!