python onvif

介绍

如何使用python接入onvif相机。

说明

使用的是python的onvif库 python-onvif-zeep,但版本很就未更新导致存在一些问题。

  • 不支持media2,导致无法获取h265(hevc)编码类型

  • event事件的支持存在问题。

不支持media2

需要更新wsdl文件到最新版本,并修改python-onvif-zeep代码,增加对media2的支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def getmedia(self):
"""
获取media: 分为media2、media,其中media2支持h265,media只支持h264
:return:
# 先使用media2,再使用media: media2支持h265
"""
try:
self.media2_service = self.mycam.create_media2_service()
except Exception as e:
print('error: {}'.format(e))
finally:
pass

# media 获取h264
if self.media2_service is None:
try:
self.media_service = self.mycam.create_media_service()
except Exception as e:
print('error: {}'.format(e))
return False
finally:
pass

return True

event事件

  • 开源库的sample写法存在问题,修改如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # event 订阅事件
    self.events_service = self.mycam.create_events_service()
    print(self.events_service.GetEventProperties())
    pullpoint = self.mycam.create_pullpoint_service()

    try:
    pullmess = pullpoint.PullMessages({"Timeout": datetime.timedelta(seconds=5), "MessageLimit": 10})
    print(pullmess.CurrentTime)
    print(pullmess.TerminationTime)
    for msg in pullmess.NotificationMessage:
    print(msg)
    except Exception as e:
    print(e)
    finally:
    pass
  • TopicExpressionType 格式无法解析
    Message 在标准定义中是个##any格式,估无法解析具体字段。但目前大部分主流ipc都使用tt:Message来实现,需要修改b-2.xsd

最后

以上bug修改,都合入新的python库
python-onvif2-zeep