前言
我就职与在海康附近的一家中小型公司,所以公司业务也和海康产品摄像头做相关业务,所以需要调动控制摄像头,在python代码发现onvif协议可以操作,亲测后记笔录一张
ONVIF致力于通过全球性的开放接口标准来推进网络视频在安防市场的应用,这一接口标准将确保不同厂商生产的网络视频产品具有互通性。2008年11月,论坛正式发布了ONVIF第一版规范——ONVIF核心规范1.0。随着视频监控的网络化应用,产业链的分工将越来越细。有些厂商专门做摄像头,有些厂商专门做DVS,有些厂商则可能专门做平台等,然后通过集成商进行集成,提供给最终客户。这种产业合作模式,已经迫切的需要行业提供越来越标准化的接口平台。
1 安装python-onvif
1.1 pip安装
python官方已经提供了onvif包的安装,因此可直接通过pip来安装,如下
pip install --upgrade onvif_zeep
要注意这里pip必须对应python3以上版本
1.2 源码安装
git clone https://github.com/FalkTannhaeuser/python-onvif-zeep.git
cd python-onvif-zeep
python setup.py install
pip3 install --upgrade onvif_zeep
1.3使用规则
python API:https://pypi.org/project/onvif/
wsdl文档:http://www.onvif.org/onvif/ver20/util/operationIndex.html
代码示例
import time
import requests
import zeep
from onvif import ONVIFCamera
from requests.auth import HTTPDigestAuth
def zeep_pythonvalue(self, xmlvalue):
return xmlvalue
class Onvif_hik(object):
def __init__(self, ip: str, username: str, password: str):
self.ip = ip
self.username = username
self.password = password
self.save_path = "./{}T{}.jpg".format(self.ip, str(time.time())) # 截图保存路径
self.content_cam()
def content_cam(self):
"""
链接相机地址
:return:
"""
try:
self.mycam = ONVIFCamera(self.ip, 80, self.username, self.password)
self.media = self.mycam.create_media_service() # 创建媒体服务
# 得到目标概要文件
zeep.xsd.simple.AnySimpleType.pythonvalue = zeep_pythonvalue
self.media_profile = self.media.GetProfiles()[0] # 获取配置信息
self.ptz = self.mycam.create_ptz_service() # 创建控制台服务
return True
except Exception as e:
return False
def Snapshot(self):
"""
截图
:return:
"""
res = self.media.GetSnapshotUri({'ProfileToken': self.media_profile.token})
response = requests.get(res.Uri, auth=HTTPDigestAuth(self.username, self.password))
with open(self.save_path, 'wb') as f: # 保存截图
f.write(response.content)
def get_presets(self):
"""
获取预置点列表
:return:预置点列表--所有的预置点
"""
presets = self.ptz.GetPresets({'ProfileToken': self.media_profile.token}) # 获取所有预置点,返回值:list
return presets
def goto_preset(self, presets_token: int):
"""
移动到指定预置点
:param presets_token: 目的位置的token,获取预置点返回值中
:return:
"""
try:
# self.ptz.GotoPreset(
# {'ProfileToken': self.media_profile.token, "PresetToken": presets_token}) # 移动到指定预置点位置
params = self.ptz.create_type('GotoPreset')
params.ProfileToken = self.media_profile.token
params.PresetToken = presets_token
self.ptz.GotoPreset(params)
except Exception as e:
print(e)
def zoom(self, zoom: str, timeout: int = 1):
"""
变焦
:param zoom: 1为拉近或-1为远离
:param timeout: 生效时间
:return:
"""
request = self.ptz.create_type('ContinuousMove')
request.ProfileToken = self.media_profile.token
request.Velocity = {"Zoom": zoom}
self.ptz.ContinuousMove(request)
time.sleep(timeout)
self.ptz.Stop({'ProfileToken': request.ProfileToken})
def get_status(self):
"""
获取当前预置点的信息
:return:
"""
params = self.ptz.create_type('GetStatus')
params.ProfileToken = self.media_profile.token
res = self.ptz.GetStatus(params)
# print(res)
return res
if __name__ == '__main__':
o = Onvif_hik(ip="192.168.0.1", username="admin", password="password")
o.goto_preset(3)
注:海康摄像头需要查看配置是否支持onvif协议,帐号密码为添加的用户列表