python 通过ONVIF控制IPC

文章介绍了ONVIF作为开放网络视频接口标准在视频设备互操作性中的作用,包括设备发现、媒体控制等功能。接着详细阐述如何使用Python环境搭建及通过onvif2-zeep库来获取和设置IPC参数,提供了代码示例来展示如何调用ONVIF协议进行配置和控制。
摘要由CSDN通过智能技术生成

一、ONVIF介绍

  1. 什么是ONVIF
  2. ONVIF的功能特点

二、使用Python来控制IPC

  1. Python的环境搭建
  2. 使用Python通过ONVIF Get和Set IPC参数

三、总结

  1. ONVIF的功能特点
  2. 使用Python来控制IPC的步骤
  3. 总结Python控制ONVIF的技术优势

一、ONVIF介绍

什么是ONVIF

ONVIF(Open Network Video Interface Forum)是一个开放的网络视频接口标准,旨在实现视频设备之间的互操作性。该标准由英特尔、英伟达、芬兰萨里大学、索尼、施乐等设备制造商组成,于2008年组建了ONVIF联盟,致力于制定一种标准,让网络视频摄像头、视频服务器、IP卡等设备可以通过ONVIF协议进行通信。

ONVIF的功能特点

ONVIF协议定义了一种标准的网络视频接口,其主要功能包括:设备发现、视频流控制、媒体控制、事件处理、访问控制等。这些功能可以让ONVIF接口的设备能够在同一个网络上互相通信,提供更好的视频监控体验。

ONVIF协议的另一个优势是使用简单,可以让不同厂家的设备通过ONVIF协议进行通信,而无需进行其他安装和调整工作。另外,ONVIF协议还可以方便地通过网络视频管理软件来管理多台ONVIF接口的设备,大大提高了视频监控的便利性和灵活性。

ONVIF标准是目前业界监控领域中使用最为广泛的网络视频接口标准,它的出现和普及大大提高了视频监控的便利性和效率,让视频监控技术发挥出更大的作用。

二、使用Python来控制IPC

Python的环境搭建

  1. 运行命令 pip install onvif2-zeep 。

  2. 如果有错误,请确保您的pip版本最新。

  3. 如果安装成功,可以在python控制台中尝试以下语句:

    from onvif import ONVIFCamera

  4. 如果没有报错,则安装成功!

  5. 安装完成后需要下载更新wsdl,访问

    https://github.com/yingchengpa/python-onvif2-zeep 将wsdl中的文件更新到.\venv\Lib\site-packages\wsdl中。更新完成后结构如下
    ├─ver10                     
    │  ├─accesscontrol          
    │  │  └─wsdl                
    │  ├─accessrules            
    │  │  └─wsdl                
    │  ├─advancedsecurity       
    │  │  └─wsdl
    │  ├─schema
    │  ├─thermal
    │  │  └─wsdl
    │  ├─topics
    │  └─uplink
    │      └─wsdl
    └─ver20
        ├─analytics
        │  └─wsdl
        ├─imaging
        │  └─wsdl
        ├─media
        │  └─wsdl
        ├─ptz
        │  └─wsdl
        └─util
    

使用Python通过ONVIF Get和Set IPC参数

在onvif2-zeep中,部分方法和参数无法进行补全提示,具体使用方法请参见/wsdl/ver20/media/wsdl/media.wsdl中的配置:

例如我在实现GetVideoEncoderConfigurations时,参考的就是/wsdl/ver20/media/wsdl/media.wsdl中如下代码

<xs:element name="GetVideoEncoderConfigurations" type="tr2:GetConfiguration"/>
			<xs:element name="GetVideoEncoderConfigurationsResponse">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="Configurations" type="tt:VideoEncoder2Configuration" minOccurs="0" maxOccurs="unbounded">
							<xs:annotation>
								<xs:documentation>This element contains a list of video encoder configurations.</xs:documentation>
							</xs:annotation>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>

返回的配置文件一般是一个json格式的对象,我们在编辑后可以再set回去。同样我会参考如下代码

<xs:element name="SetVideoEncoderConfiguration">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="Configuration" type="tt:VideoEncoder2Configuration">
							<xs:annotation>
								<xs:documentation>Contains the modified video encoder configuration. The configuration shall exist in the device.</xs:documentation>
							</xs:annotation>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:complexType name="SetConfigurationResponse">
				<xs:sequence>
				</xs:sequence>
			</xs:complexType>

同理,其他功能可以通过参考wsdl文件进行调用。

三、总结

ONVIF的功能特点

通过调用ONVIF可以达到对设备进行配置,控制,拉流,截图等的调用。结

使用Python来控制IPC的步骤

from onvif2 import ONVIFCamera, ONVIFError

'''
when use onvif2, you should install onvif2-zeep first 
and download wsdl file from github:https://github.com/yingchengpa/python-onvif2-zeep.
then, set wsdl_dir to the path of wsdl file.
'''


class IPC():
    def __init__(self, host, port, user, passwd):
        self.device = ONVIFCamera(host, port, user, passwd,
                                  wsdl_dir=r'D:\tsing\511\workspace\IPC_scanner\venv\Lib\site-packages\wsdl')
        self.media2_service = self.device.create_media2_service()

    def GetIPCInfo(self):
        self.sourcecfg = self.GetVideoSourceConfigurations()
        self.encodercfg = self.GetVideoEncoderConfigurations()
        self.profiles = self.GetProfiles()
        self.osds = self.GetOSDs()
        self.info = self.GetDeviceInformation()
        return {
            'sourcecfg': self.sourcecfg,
            'encodercfg': self.encodercfg,
            'profiles': self.profiles,
            'osds': self.osds,
            'info': self.info
        }

    def SetIPCInfo(self, ratio=(1920, 1080), Encoding='H265', bitrate=2048, fps=25, gop=50):
        if ratio[0] > self.sourcecfg[0]['Bounds']['width']:
            raise ONVIFError(f'ratio Error: max width should less then {self.sourcecfg[0]["Bounds"]["width"]}')
        if ratio[1] > self.sourcecfg[1]['Bounds']['height']:
            raise ONVIFError(f'ratio Error: max height should less then {self.sourcecfg[0]["Bounds"]["height"]}')
        if Encoding.upper() not in ('H265', 'H264'):
            raise ONVIFError(f'encoding Error: enconding format should be "H265" or "H264"')
        self.encodercfg[0]['Resolution']['Width'] = ratio[0]
        self.encodercfg[0]['Resolution']['Height'] = ratio[1]
        self.encodercfg[0]['Encoding'] = Encoding.upper()
        self.encodercfg[0]['RateControl']['FrameRateLimit'] = float(fps)
        self.encodercfg[0]['RateControl']['BitrateLimit'] = bitrate
        self.encodercfg[0]['GovLength'] = gop

        return self.SetVideoEncoderConfigurations(self.encodercfg)

    def GetDeviceInformation(self):
        info = self.device.devicemgmt.GetDeviceInformation()
        return info

    def GetVideoSourceConfigurations(self):
        sourceConfigurations = self.media2_service.GetVideoSourceConfigurations()
        return sourceConfigurations

    def GetVideoEncoderConfigurations(self):
        configurations = self.media2_service.GetVideoEncoderConfigurations()
        return configurations

    def SetVideoEncoderConfigurations(self, conf):
        try:
            self.media2_service.SetVideoEncoderConfiguration(conf)
            return True
        except:
            return False

    def GetProfiles(self):
        profiles = self.media2_service.GetProfiles()
        return profiles

    def GetOSDs(self):
        osds = self.media2_service.GetOSDs()
        return osds

    def GetStreamUri(self):
        return self.media2_service.GetStreamUri()


if __name__ == '__main__':
    host = '192.168.1.51'
    port = 80
    user = 'onvif'
    passwd = '*****'
    device = IPC(host, port, user, passwd)
    print('GetVideoSourceConfigurations', device.GetVideoSourceConfigurations())
    print('---------------')
    print('GetVideoEncoderConfigurations', device.GetVideoEncoderConfigurations())
    print('---------------')
    print('GetProfiles', device.GetProfiles())
    print('---------------')
    print('GetOSDs', device.GetOSDs())
    print('---------------')
    print('GetDeviceInformation', device.GetDeviceInformation())
    # should be get configurations before set.
    device.SetIPCInfo(ratio=(3840, 2160), Encoding='H264', bitrate=4096, fps=20, gop=30)

总结Python控制ONVIF的技术优势

通过python 控制ONVIF,适用于多设备的监控,调试,巡查等。减少了逐一操作的时间成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测试小胖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值