You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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)

关键修正点说明

  1. 过滤器结构标准化:按照ONVIF WSDL定义的RecordingInformationFilter类型构造字典,而非字符串拼接,这是过滤器生效的核心前提。
  2. 语法错误修复:移除了原代码中filter变量末尾多余的右括号,避免运行时语法报错。
  3. 时间格式校验:确保起始/结束时间为UTC时区的ISO8601格式(以Z结尾),如果使用本地时间需要先转换为UTC,否则会导致时间范围匹配偏差。
  4. 服务精简:仅保留必要的record_search服务,无需创建未用到的media_service和replay_service。

额外注意事项

  • 确认大华NVR已开启ONVIF录像搜索权限(可在NVR系统设置的ONVIF选项中检查);
  • 若需指定特定摄像头的录像,可在Scope中添加RecordingTokenFilter,传入目标摄像头的RecordingToken(可通过record_search.GetRecordings()接口获取所有录像Token)。

内容的提问来源于stack exchange,提问作者Puneet Chaudhary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 22:57:35