实测python-onvif协议控制摄像头[梧桐凰]

前言

我就职与在海康附近的一家中小型公司,所以公司业务也和海康产品摄像头做相关业务,所以需要调动控制摄像头,在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协议,帐号密码为添加的用户列表
在这里插入图片在这里插入图片描述
描述

  • 7
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
可以使用开源的ONVIF Device Manager库来实现Spring Boot与Onvif协议的整合控制海康摄像头转动。 以下是实现步骤: 1. 在pom.xml文件中引入ONVIF Device Manager依赖: ```xml <dependency> <groupId>com.github.onvif</groupId> <artifactId>onvif-device-manager</artifactId> <version>${onvif.device.manager.version}</version> </dependency> ``` 2. 创建一个OnvifService类,用于调用Onvif Device Manager库的API: ```java @Service public class OnvifService { private static final Logger logger = LoggerFactory.getLogger(OnvifService.class); @Autowired private OnvifDeviceManager onvifDeviceManager; /** * 获取设备信息 * @param ipAddress 设备IP地址 * @param username 用户名 * @param password 密码 * @return 设备信息 * @throws ConnectException 连接异常 * @throws SOAPException SOAP异常 * @throws IOException IO异常 */ public OnvifDeviceInfo getDeviceInfo(String ipAddress, String username, String password) throws ConnectException, SOAPException, IOException { OnvifCamera onvifCamera = onvifDeviceManager.getOnvifCamera(ipAddress, username, password); if (onvifCamera == null) { return null; } return new OnvifDeviceInfo(onvifCamera.getHostname(), onvifCamera.getManufacturer(), onvifCamera.getModel(), onvifCamera.getFirmwareVersion()); } /** * 控制云台转动 * @param ipAddress 设备IP地址 * @param username 用户名 * @param password 密码 * @param tilt 垂直方向转动速度 * @param pan 水平方向转动速度 * @throws ConnectException 连接异常 * @throws SOAPException SOAP异常 * @throws IOException IO异常 */ public void move(String ipAddress, String username, String password, float tilt, float pan) throws ConnectException, SOAPException, IOException { OnvifCamera onvifCamera = onvifDeviceManager.getOnvifCamera(ipAddress, username, password); if (onvifCamera == null) { return; } OnvifPTZ ptz = onvifCamera.getPtz(); if (ptz == null) { return; } ptz.move(tilt, pan); } } ``` 3. 在Controller中注入OnvifService类,调用其API实现控制海康摄像头转动: ```java @RestController @RequestMapping("camera") public class CameraController { @Autowired private OnvifService onvifService; /** * 获取设备信息 * @param ipAddress 设备IP地址 * @param username 用户名 * @param password 密码 * @return 设备信息 */ @GetMapping("info") public OnvifDeviceInfo getDeviceInfo(String ipAddress, String username, String password) { try { return onvifService.getDeviceInfo(ipAddress, username, password); } catch (ConnectException | SOAPException | IOException e) { e.printStackTrace(); return null; } } /** * 控制云台转动 * @param ipAddress 设备IP地址 * @param username 用户名 * @param password 密码 * @param tilt 垂直方向转动速度 * @param pan 水平方向转动速度 */ @PostMapping("move") public void move(String ipAddress, String username, String password, float tilt, float pan) { try { onvifService.move(ipAddress, username, password, tilt, pan); } catch (ConnectException | SOAPException | IOException e) { e.printStackTrace(); } } } ``` 以上就是使用Spring Boot整合Onvif协议控制海康摄像头转动的实现步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值