onvif-python

资料是真的很少.........

目录

安装包

安装流程

使用


安装包

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

智能事件我抓不下来...............先这样

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值