使用ONVIF从大华NVR获取指定时间段录像的问题求助
解决大华NVR通过ONVIF获取指定时间段历史录像的过滤器失效问题
你的代码核心问题在于错误地使用字符串拼接作为RecordingInformationFilter参数——ONVIF的FindRecordings接口要求过滤器是符合tt:RecordingInformationFilter规范的结构化数据,而非简单的逗号分隔字符串。同时原代码还存在语法错误(filter变量末尾多余的右括号),以下是修正后的完整方案:
修正后的代码
from onvif2 import ONVIFCamera nvr_ip = "192.168.11.155" nvr_username = "admin" nvr_password = "admin123" # 初始化NVR连接 nvr = ONVIFCamera(nvr_ip, 80, nvr_username, nvr_password, wsdl_dir="/home/itsupport/Desktop/vms_1/python_onvif2_zeep_master/wsdl") # 创建录像搜索服务 record_search = nvr.create_search_service() # 构造符合ONVIF规范的录像过滤器 recording_filter = { # 过滤仅包含视频轨道的录像 "TrackFilter": "//Track[TrackType='Video']", # 起始时间(必须为UTC时区的ISO8601格式,以Z结尾) "StartTime": "2023-08-20T08:07:43.000Z", # 结束时间 "EndTime": "2023-08-22T08:07:43.000Z", # 可选:仅返回处于活跃状态的录像片段 "RecordingStatusFilter": "Active" } # 构造搜索范围参数 scope = { "Scope": { "RecordingInformationFilter": recording_filter }, "KeepAliveTime": "PT60S" } # 发起搜索请求 search_token = record_search.FindRecordings(scope) # 获取最终搜索结果 search_results = record_search.GetRecordingSearchResults(search_token) # 打印结果验证 print(search_results)
关键修正点说明
- 过滤器结构标准化:按照ONVIF WSDL定义的
RecordingInformationFilter类型构造字典,而非字符串拼接,这是过滤器生效的核心前提。 - 语法错误修复:移除了原代码中
filter变量末尾多余的右括号,避免运行时语法报错。 - 时间格式校验:确保起始/结束时间为UTC时区的ISO8601格式(以
Z结尾),如果使用本地时间需要先转换为UTC,否则会导致时间范围匹配偏差。 - 服务精简:仅保留必要的
record_search服务,无需创建未用到的media_service和replay_service。
额外注意事项
- 确认大华NVR已开启ONVIF录像搜索权限(可在NVR系统设置的ONVIF选项中检查);
- 若需指定特定摄像头的录像,可在
Scope中添加RecordingTokenFilter,传入目标摄像头的RecordingToken(可通过record_search.GetRecordings()接口获取所有录像Token)。
内容的提问来源于stack exchange,提问作者Puneet Chaudhary
相关产品推荐
相关产品推荐

