如何通过ONVIF Profile G获取设备的独立录像记录列表?
问题分析与解决方案
你的实现方式不正确,原因是GetMediaAttributes方法的设计目的并非枚举独立录像片段——它的作用是获取指定时间点对应的媒体流属性(如编码格式、分辨率等),而非返回所有分割的录像记录,所以返回合并后的单条结果是符合该接口预期的。
要获取设备上的每条独立录像记录,你需要使用ONVIF Profile G定义的SearchRecordings接口,该接口专门用于搜索并返回符合条件的录像片段列表。
大致实现步骤:
- 构造
_tse__SearchRecordings请求对象,设置必要参数:- 指定搜索的时间范围(如果需要全量搜索,可设置起始时间为0,结束时间为当前时间)
- 设置
IncludeRecordings为true,确保返回录像片段详情 - 可根据需求添加过滤条件(如录像来源、类型等)
- 调用
SearchBindingProxy的SearchRecordings方法,获取_tse__SearchRecordingsResponse响应 - 从响应的
RecordingInformation列表中遍历每条独立录像记录
简化代码示例:
#include "soapSearchBindingProxy.h" #include <ctime> std::unique_ptr<SearchBindingProxy> deviceSearchBindingProxy = std::make_unique<SearchBindingProxy>(); _tse__SearchRecordings searchReq; _tse__SearchRecordingsResponse searchResp; // 设置搜索时间范围:从设备录像起始到当前时间 searchReq.StartTime = 0; searchReq.EndTime = time(nullptr); searchReq.IncludeRecordings = true; // 调用搜索接口 if (deviceSearchBindingProxy->SearchRecordings(&searchReq, searchResp) == SOAP_OK) { // 遍历返回的每条独立录像记录 for (auto& recordingInfo : searchResp.RecordingInformation) { // 处理录像信息:如StartTime、EndTime、RecordingToken、媒体轨道属性等 } }
注意:部分设备可能需要先通过GetRecordings接口获取所有可用的RecordingToken,再针对每个Token进行精准搜索,具体需参考设备的ONVIF实现文档。
内容的提问来源于stack exchange,提问作者Massimo
相关产品推荐
相关产品推荐

