最近由于工作需要,需要用ONVIF来快速验证一个想法,发现在Python下验证还蛮方便的,但是也遇到了一些问题,在这里总结一下,如有有缘人看见,或许可以节约一些时间。

目录

一、Python对接onvif的工具

二、Onvif快速用起来

三、使用原理简析


一、Python对接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快速用起来

        首先需要说明一下,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的其它功能都有哪些,可参考官网:

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用起来基本都是这流程,相信大家没有问题的。

        接下来更多、更复杂、更花哨、更激动人心的功能就凭大家自由发挥啦!