searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

ONVIF录像查询实现概要

2023-06-13 10:39:41
571
0

前言:

目前中文互联网上比较难找到ONVIF协议如何具体地实现录像查询功能,自己在整理、学习资料,实现功能的不同时期遇到了或大或小的阻力,故编写此文,用于记录自己学习的过程,留存翻阅、理解资料后得出的成果。

本文使用的工具为ONVIF Device Test Tool 19.06,使用此工具可视作一个可用的Client,其操作过程与Client的功能实现基本一致,故可用使用此工具辅助自己的功能开发。同样的,使用此工具的操作流程,即是Client功能的实现流程。

笔者使用的为gsoap生成的ONVIF框架,调用接口即可结构化地输入输出,因而以此工具演示ONVIF录像查询的操作流程,操作流程的步骤基本可以与被调用的接口一一对应,只需要添加一些数据上的逻辑判断和异常控制就是录像查询的代码了。下文以操作实录为例用于演示

录像查询的实现过程:

(0)部分设备可能默认关闭了ONVIF,请在设备web端控制台开启ONVIF并配置ONVIF用户。

(1)点击左侧 Discover Devices 按钮,下方文本框选择摄像头IP,右侧输入User Name和Password后点击 Check 按钮

 

(2)顶部切换至 Debug 分页项,点击 Get Services 按钮,从XAddr项中获取服务地址

 

值得一提的是顶部选项栏左侧Get Capabilities/Services,其中Get Capabilities在现版本ONVIF协议中已被废弃,Services中包括了Capabilities所有内容,而且存在例如Media2等只有Services能查询到的服务地址,所以一般使用Services查询设备能力集。右侧选项栏为鉴权方式,在部分厂商设备下会有鉴权失败的影响。

(3)发送FindEvents请求,Request发送内容可以填充参数也可以修改结构体自行编辑,部分可选项如IncludedSources可以删掉不填。(请求发送的时间为UTC时间,需进行时区时间换算)填写start/endPoint,将RecordingToken(后文会解释这个token怎么获取)填入<Scope><IncludedRecording>内。<MaxMatches>表示查询的匹配数量(最大为30),<KeepAliveTime>表示查询到的异步token的保活时间。

 

(4)通过返回的SearchToken使用GetEventSearchResults()得到录像标记点。此处可以设置查询返回的结果数量和最大等待时间。

(5)通过<Result>-<Event>-<Message>-<Data>-<Name>为IsDataPresent的项,Value值为true是录像的起始点,为false是录像的结束点,Result成组顺序出现(可见下图案例,为什么是这样的可见文末方法来源)。同时录像可能分Track,由此设备可见同时存在VIDEO视频和AUDIO音频录像。虽然可以通过设置MaxMatches改变单次查询的返回数目,但一次GetResults最大上限为30个results,如果这些results不能包括所有录像,则在SearchToken的KeepAliveTime时间内,复数次查询会不断显示之前未被展示的查询结果,直至查询到 录像结束||EndPoint||达到Find中的MaxMatches,另外值得注意的是最后一次查询时<SearchState>返回内容为Complete(未查询完成时的SearchState的值为Searching),表示查询结果返回完毕。

 

(6)此时可以通过RecordingToken获取到设备录像列表,此参数一般不在设备能力集里面,另外需要分辨为音频或视频录像的Tracktoken不仅后半是码流标号,而且前半部分的值在不同设备中很可能是不同的。

笔者的解决方法是通过RecordingControl下的GetRecordingJobs方法建立RecordingToken与ProfileToken的联系(在此方法的查询结果中同时包含这两个值,下同)。通过RecordingControl下的GetRecordings方法可以建立RecordingToken与TrackToken的联系。需要再花费两次查询去建立ProfileToken和该码流对应的录像列表的关系。

(7)另外其他接口的测试可以通过Debug下来自定义发送接口请求,也可以通过第二上边栏发送PTZ/Media等可设置图形化的参数选项的Get/Set请求,比较方便。

 

 

Recording判别方法的依据:

前文提到的Recording的判别方法,在官方指南中有如下描述,也即通过具有IsDataPresent属性的event的value-true|false来判断录像的开始|结束时间。遇事不决还是应该查官方文档,就是官方文档啥都有写的很长,索引有时候又做的不太合理,导致一些内容不太好找,被庞大的无效信息淹没了。。。

 

官方文档和指南:

ONVIF官方接口文档:

https://www.onvif.org/ch/profiles/specifications/

ONVIF官方开发指南:

https://www.onvif.org/wp-content/uploads/2016/12/ONVIF_WG-APG-Application_Programmers_Guide-1.pdf

0条评论
0 / 1000
w****n
4文章数
0粉丝数
w****n
4 文章 | 0 粉丝
w****n
4文章数
0粉丝数
w****n
4 文章 | 0 粉丝
原创

ONVIF录像查询实现概要

2023-06-13 10:39:41
571
0

前言:

目前中文互联网上比较难找到ONVIF协议如何具体地实现录像查询功能,自己在整理、学习资料,实现功能的不同时期遇到了或大或小的阻力,故编写此文,用于记录自己学习的过程,留存翻阅、理解资料后得出的成果。

本文使用的工具为ONVIF Device Test Tool 19.06,使用此工具可视作一个可用的Client,其操作过程与Client的功能实现基本一致,故可用使用此工具辅助自己的功能开发。同样的,使用此工具的操作流程,即是Client功能的实现流程。

笔者使用的为gsoap生成的ONVIF框架,调用接口即可结构化地输入输出,因而以此工具演示ONVIF录像查询的操作流程,操作流程的步骤基本可以与被调用的接口一一对应,只需要添加一些数据上的逻辑判断和异常控制就是录像查询的代码了。下文以操作实录为例用于演示

录像查询的实现过程:

(0)部分设备可能默认关闭了ONVIF,请在设备web端控制台开启ONVIF并配置ONVIF用户。

(1)点击左侧 Discover Devices 按钮,下方文本框选择摄像头IP,右侧输入User Name和Password后点击 Check 按钮

 

(2)顶部切换至 Debug 分页项,点击 Get Services 按钮,从XAddr项中获取服务地址

 

值得一提的是顶部选项栏左侧Get Capabilities/Services,其中Get Capabilities在现版本ONVIF协议中已被废弃,Services中包括了Capabilities所有内容,而且存在例如Media2等只有Services能查询到的服务地址,所以一般使用Services查询设备能力集。右侧选项栏为鉴权方式,在部分厂商设备下会有鉴权失败的影响。

(3)发送FindEvents请求,Request发送内容可以填充参数也可以修改结构体自行编辑,部分可选项如IncludedSources可以删掉不填。(请求发送的时间为UTC时间,需进行时区时间换算)填写start/endPoint,将RecordingToken(后文会解释这个token怎么获取)填入<Scope><IncludedRecording>内。<MaxMatches>表示查询的匹配数量(最大为30),<KeepAliveTime>表示查询到的异步token的保活时间。

 

(4)通过返回的SearchToken使用GetEventSearchResults()得到录像标记点。此处可以设置查询返回的结果数量和最大等待时间。

(5)通过<Result>-<Event>-<Message>-<Data>-<Name>为IsDataPresent的项,Value值为true是录像的起始点,为false是录像的结束点,Result成组顺序出现(可见下图案例,为什么是这样的可见文末方法来源)。同时录像可能分Track,由此设备可见同时存在VIDEO视频和AUDIO音频录像。虽然可以通过设置MaxMatches改变单次查询的返回数目,但一次GetResults最大上限为30个results,如果这些results不能包括所有录像,则在SearchToken的KeepAliveTime时间内,复数次查询会不断显示之前未被展示的查询结果,直至查询到 录像结束||EndPoint||达到Find中的MaxMatches,另外值得注意的是最后一次查询时<SearchState>返回内容为Complete(未查询完成时的SearchState的值为Searching),表示查询结果返回完毕。

 

(6)此时可以通过RecordingToken获取到设备录像列表,此参数一般不在设备能力集里面,另外需要分辨为音频或视频录像的Tracktoken不仅后半是码流标号,而且前半部分的值在不同设备中很可能是不同的。

笔者的解决方法是通过RecordingControl下的GetRecordingJobs方法建立RecordingToken与ProfileToken的联系(在此方法的查询结果中同时包含这两个值,下同)。通过RecordingControl下的GetRecordings方法可以建立RecordingToken与TrackToken的联系。需要再花费两次查询去建立ProfileToken和该码流对应的录像列表的关系。

(7)另外其他接口的测试可以通过Debug下来自定义发送接口请求,也可以通过第二上边栏发送PTZ/Media等可设置图形化的参数选项的Get/Set请求,比较方便。

 

 

Recording判别方法的依据:

前文提到的Recording的判别方法,在官方指南中有如下描述,也即通过具有IsDataPresent属性的event的value-true|false来判断录像的开始|结束时间。遇事不决还是应该查官方文档,就是官方文档啥都有写的很长,索引有时候又做的不太合理,导致一些内容不太好找,被庞大的无效信息淹没了。。。

 

官方文档和指南:

ONVIF官方接口文档:

https://www.onvif.org/ch/profiles/specifications/

ONVIF官方开发指南:

https://www.onvif.org/wp-content/uploads/2016/12/ONVIF_WG-APG-Application_Programmers_Guide-1.pdf

文章来自个人专栏
视频监控
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0