资料是真的很少.........
目录
安装包
https://github.com/yingchengpa/python-onvif2-zeep
在这里下载2的包
安装流程
进入对应的conda环境
运行文件夹下的 python setup.py install
但是这样安装的包是用不了的,因为2的包需要ver10和v20去调用
所以要把下载文件夹里面的这两个文件夹放到
D:\anaconda\envs\py38\Lib\site-packages\onvif2_zeep-0.3.3-py3.8.egg
目录下才能调用
使用
def rtsp_url(ip):
# 想直接看要在web里面关闭onvif鉴权
mycam = ONVIFCamera(ip, 80, '用户名', '密码', wsdl_dir = r'D:\anaconda\envs\py38\Lib\site-packages\onvif2_zeep-0.3.3-py3.8.egg')
# 开启服务
media_service = mycam.create_media_service()
media_profile = media_service.GetProfiles()[0]
obj = media_service.create_type('GetStreamUri')
obj.StreamSetup = {'Stream': 'RTP-Unicast', 'Transport': {'Protocol': 'RTSP'}}
obj.ProfileToken = media_profile.token
res_uri = media_service.GetStreamUri(obj)['Uri']
print(res_uri)
import cv2
cap = cv2.VideoCapture(res_uri)
ret, frame = cap.read()
while ret:
ret, frame = cap.read()
cv2.imshow("frame", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
cap.release()
上面的代码是获取rtsp流的数据,要在web控制里关闭onvif协议的禁用,不然不能看rtsp流哦
修改图像配置
# 修改图像配置
def focus(ip):
mycam = ONVIFCamera(ip, 80, '用户名', '密码',
wsdl_dir=r'D:\anaconda\envs\py38\Lib\site-packages\onvif2_zeep-0.3.3-py3.8.egg')
imaging = mycam.create_imaging_service()
# 创建一个获取图像信息的属性
request = imaging.create_type('GetImagingSettings')
# 开启服务
media_service = mycam.create_media_service()
# 获得对应的token
media_profile = media_service.GetProfiles()[0]
request.VideoSourceToken = media_profile.VideoSourceConfiguration.SourceToken
Token = request['VideoSourceToken']
# 获得配置信息
config = imaging.GetImagingSettings(request)
# print(config)
# 通光量
config['Brightness'] = 60
# 色彩饱和度
config['Contrast'] = 60
# 曝光模式
# MANUAL
# config['Exposure']['Mode'] = 'MANUAL'
# 光圈
# config['Exposure']['Iris'] = 1
# 对焦模式
config['Focus']['AutoFocusMode'] = 'AUTO'
# 对焦速度
# config['Focus']['DefaultSpeed'] = 1
# 锋利度
config['Sharpness'] = 80
imaging.SetImagingSettings({'VideoSourceToken': Token, 'ImagingSettings': config, 'ForcePersistence': True})
抓图
def picture(ip):
# 抓图
mycam = ONVIFCamera(ip, 80, '用户名', '密码', wsdl_dir = r'D:\anaconda\envs\py38\Lib\site-packages\onvif2_zeep-0.3.3-py3.8.egg')
# 开启服务
media_service = mycam.create_media_service()
# 获得token,就是找到摄像机对应码流
media_profile = media_service.GetProfiles()[0]
import requests, os
# 你看,是这么个逻辑,如果我用create_type创建一个属性,他就会让我自己去填充这个属性的字典
# 然后我根据文档的内容去填充字典之后,调用方法,把值给这个方法,就能用了
obj = media_service.create_type('GetSnapshotUri')
obj.ProfileToken = media_profile.token
res = media_service.GetSnapshotUri(obj)
# 这是一个登陆验证
auth = requests.auth.HTTPDigestAuth('admin', 'admin123')
# 地址是摄像头的地址
response = requests.get(url=res.Uri, auth=auth)
path_out = os.path.join('./', 'tmp.jpg')
with open(path_out, 'wb') as fp:
fp.write(response.content)
修改视频配置
def configCamVideo(ip):
# 改分辨率
mycam = ONVIFCamera(ip, 80, '用户名', '密码', wsdl_dir = r'D:\anaconda\envs\py38\Lib\site-packages\onvif2_zeep-0.3.3-py3.8.egg')
# 开启服务
media_service = mycam.create_media_service()
# 获得配置
configurations = media_service.GetVideoEncoderConfigurations()
for configuration in configurations:
# 这个名称要在configuration里面看name
if configuration['Name'] == 'VideoEncoderConfig_Channel1_MainStream':
if configuration['Encoding'].lower() == 'h264' or configuration['Encoding'].lower() == 'h265':
width = configuration['Resolution']['Width']
height = configuration['Resolution']['Height']
configuration['Resolution']['Width'] = 1920
configuration['Resolution']['Height'] = 1080
# configuration['RateControl']['FrameRateLimit'] = 1
# configuration['RateControl']['BitrateLimit'] = 448
# configuration['GovLength'] = 1
# print(configuration)
# 我终于想明白这个要怎么写了,他的参数要当做字典去写
media_service.SetVideoEncoderConfiguration({'Configuration':configuration, 'ForcePersistence':True})
return True
智能事件我抓不下来...............先这样