如何通过Python的ONVIF库调用Recording功能访问IP摄像头SD卡
问题描述
我想用Python的python-onvif库远程访问IP摄像头的SD卡,目前能正常调用DeviceMgmt功能(通过mycam.devicemgmt),也能先创建PTZ服务(ptz=mycam.create_ptz_service())再用mycam.ptz调用PTZ功能,但搞不懂这两种调用方式的差异。
调用mycam.devicemgmt.GetCapabilities()后发现,PTZ可以直接访问,但Recording在Extension节点下,和DeviceIO等功能并列,现在不知道怎么调用Recording功能,求对应的Python语法。附GetCapabilities返回结构:
{ 'PTZ': { 'XAddr': 'http://XXX.XXX.XXX.XXX/onvif/PTZ', '_value_1': None, '_attr_1': None }, 'Extension': { '_value_1': [ <Element {http://www.onvif.org/ver10/schema}DeviceIO at 0x2722de89f00>, <Element {http://www.onvif.org/ver10/schema}Recording at 0x2722de89ec0>, <Element {http://www.onvif.org/ver10/schema}Search at 0x2722de89e40>, <Element {http://www.onvif.org/ver10/schema}Replay at 0x2722de89f40> ] }
解答
一、两种调用方式的差异
- 直接通过
mycam.devicemgmt调用:DeviceMgmt是ONVIF的核心基础服务,python-onvif库默认会自动初始化该服务,因此可直接通过实例属性访问其API。 - 先创建服务再调用(如PTZ):PTZ这类属于扩展服务,库不会默认初始化,必须手动调用
create_xxx_service()方法创建对应服务实例,之后才能通过mycam.ptz访问该服务的功能。
二、调用Recording服务的步骤
Recording属于Extension下的扩展服务,需手动初始化服务实例,具体操作如下:
- 提取Recording服务的XAddr
从GetCapabilities返回结果中找到Recording服务的地址:
# 获取设备能力信息 capabilities = mycam.devicemgmt.GetCapabilities() # 遍历Extension中的服务元素,提取Recording的XAddr recording_xaddr = None for service in capabilities.Extension._value_1: if service.tag == 'Recording': recording_xaddr = service.get('XAddr') break
- 创建Recording服务实例
使用专用方法或通用方法初始化服务:
# 方式一:使用专用创建方法 mycam.create_recording_service(address=recording_xaddr) # 方式二:使用通用创建方法指定服务类型 mycam.create_service('Recording', address=recording_xaddr)
- 调用Recording服务API
创建完成后,即可通过mycam.recording调用相关功能,比如获取录制能力、SD卡录像文件列表:
# 获取录制能力 recording_cap = mycam.recording.GetRecordingCapabilities() # 获取录像文件记录 recordings = mycam.recording.GetRecordings()
注意:不同摄像头的ONVIF实现可能存在差异,确保mycam实例已完成正确的身份认证,若调用出错,可检查XAddr是否正确,或参考设备的ONVIF文档确认支持的API。
内容的提问来源于stack exchange,提问作者simthi
相关产品推荐
相关产品推荐

