从零开始精通Onvif之录像存储

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。

概述

        Onvif的录像存储功能主要由Media、Recording和Replay三个关键服务共同支持。它们协同工作,为录像的存储、检索和播放提供了标准化的接口。

        Media服务:负责视频流的配置和传输,包括实时流和录像流。一般来说,实时流对应子码流,录像流对应主码流。Media服务定义了如何配置录像参数(包括:编码格式、分辨率、帧率、码率等),以及如何申请主子码流。

        Recording服务:负责录像的管理,允许客户端创建、修改和删除录像配置文件,查询可用的录像,以及管理录像存储策略等。用户还可以设定录像计划、存储位置、录像触发条件等。

        Replay服务: 负责录像的检索和回放,用户可以根据时间段、事件类型、录像ID等多种条件检索录像片段,并请求回放指定的录像数据。

工作机制

        针对录像存储,Onvif协议内嵌了一系列服务和消息交互流程,涵盖配置、存储、检索到回放的全过程。

        1、录像配置。

        通过Onvif的Recording服务,客户端可以灵活配置录像的各项参数。这不仅包括设定录像计划、指定存储目的地,还包括设置录像的质量参数(比如:分辨率、帧率、码率等)、保存天数等。

        2、录像检索。

        客户端根据需要构建录像检索参数,包括开始时间、结束时间、通道ID、事件类型等。利用构建好的检索参数,客户端通过FindRecordings操作向设备发送请求,开始录像搜索。该操作可能会立即返回搜索结果,也可能先返回一个搜索令牌。

        如果返回的是搜索令牌,客户端需要使用GetRecordingSearchResults操作,并传递该令牌来获取实际的录像检索结果。对于每一个检索到的录像条目,我们可以进一步使用GetRecordingInformation获取详细的录像信息。

        3、录像回放。

        针对选定的录像条目,我们可以使用GetReplayUri操作请求一个回放的URI。这个URI指向录像的实际音视频数据,既可以用于播放,也可以用于下载。播放和下载,可以使用RTSP协议,通过回放URI建立到设备的流媒体会话,进而传输音视频流。

录像配置

        录像存储首先需要配置录像计划,这包括设定录像的触发条件(时间计划、运动检测等)、存储位置(本地存储、网络存储等)、录像质量(分辨率、帧率、码率等)。比如:可以设定工作日的办公时间自动开启高清录像,非工作时间则降低画质以节省存储空间。

        在Onvif中,可以通过ModifyRecordingSettings操作来更新录像计划。可以参考下面的示例报文来进行理解,其中的一些关键节点和属性描述如下。

        <ns:RecordingToken>:表示要修改的录像配置的唯一标识符。

        <ns:TimeRangeList>:表示录像计划,可以包含多个时间范围。

        <ns:TimeRange>:定义了录像开始和结束的具体时间。

<soapenv:Envelope 
    xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:wsa="http://www.w3.org/2005/08/addressing" 
    xmlns:ns="http://www.onvif.org/ver10/media/wsdl">
   <soapenv:Header>
      <wsa:Action>http://www.onvif.org/ver10/media/wsdl/ModifyRecordingSettings</wsa:Action>
      <wsa:To>http://[IP]:[Port]/onvif/media_service</wsa:To>
   </soapenv:Header>
   <soapenv:Body>
      <ns:ModifyRecordingSettings>
         <ns:RecordingToken>[Recording_Token]</ns:RecordingToken>
         <ns:Schedule>
            <!-- 定义录像计划 -->
            <ns:TimeRangeList>
               <ns:TimeRange>
                  <ns:From>2024-06-10T08:00:00Z</ns:From>
                  <ns:To>2024-06-10T18:00:00Z</ns:To>
               </ns:TimeRange>
               <!-- 可添加多个TimeRange,以定义更复杂的计划 -->
            </ns:TimeRangeList>
         </ns:Schedule>
      </ns:ModifyRecordingSettings>
   </soapenv:Body>
</soapenv:Envelope>

录像检索

        Onvif协议支持动态存储策略,比如:循环覆盖、事件优先等。当存储空间达到阈值时,旧的录像数据会被自动覆盖,保证最新数据始终可用。另外,基于报警事件(比如:移动侦测)的录像可以被标记为不可覆盖,确保关键数据的长期储存。

        Onvif协议中检索录像主要通过FindRecordings操作来实现,可以参考下面的示例报文。

        <ns:SourceToken>:标识录像资源的字符串,通常对应于摄像头通道,或其他录像源的唯一标识符。比如:Channel1代表第一个摄像头的录像资源。

        <ns:Begin>:表示录像检索的开始时间,按照ISO 8601标准格式表示。比如:2024-06-10T00:00:00Z代表2024年6月10日午夜零点整(UTC时间)。

        <ns:End>:表示录像检索的结束时间,同样遵循ISO 8601标准格式。

        <ns:EventFilter>:如果录像与特定事件(比如:移动侦测、视频遮挡等)关联,可以通过此元素指定事件类型来过滤录像。

        <ns:StateFilter>:用于过滤录像的状态(比如:只检索已完成的录像,或正在进行的录像)。

        <ns:MaxMatches>:用于限制返回的最大录像数,有助于分页处理大量结果。

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope
    xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:wsa="http://www.w3.org/2005/08/addressing" 
    xmlns:ns="http://www.onvif.org/ver10/media/wsdl">
   <soapenv:Body>
      <ns:FindRecordings>
         <!-- 搜索过滤条件 -->
         <ns:SearchCriteria>
            <ns:Source>
               <!-- 录像来源,比如:通道ID -->
               <ns:SourceToken>Channel1</ns:SourceToken>
            </ns:Source>
            <ns:TimeRange>
               <ns:Begin>2024-06-01T00:00:00Z</ns:Begin>
               <ns:End>2024-06-30T23:59:59Z</ns:End>
            </ns:TimeRange>
            <!-- 可以添加更多过滤条件,比如:事件类型过滤等 -->
         </ns:SearchCriteria>
         <!-- 其他可选参数 -->
      </ns:FindRecordings>
   </soapenv:Body>
</soapenv:Envelope>

        当客户端发起录像检索请求后,设备通常会以SOAP报文的形式返回检索结果,这些结果包含找到的录像段信息。可以参考下面的示例报文来进行理解,其中的一些关键节点和属性描述如下。

        <ns:RecordingInformationList>:表示一个或多个录像信息条目。

        <ns:RecordingInformation>:表示每个录像的信息。

        <ns:RecordingToken>:表示录像的唯一标识符,每个录像文件的Token是不同的。

        <ns:Source>:表示录像的来源信息(比如:通道或者源设备)。

        <ns:StartTime/StopTime>:表示录像的起止时间。

        <ns:Duration>:表示录像的持续时间。

        <ns:Content>:表示录像的内容描述,可能包含录像的大小、数据范围等。

        <ns:TrackInformationList>:可选参数,如果有多个轨道(比如:视频、音频、文本等),会列出每个轨道的详细信息。

<soapenv:Envelope ...>
   <soapenv:Body>
      <ns:FindRecordingsResponse>
         <ns:RecordingInformationList>
            <ns:RecordingInformation>
               <ns:RecordingToken>[RecordingToken_1]</ns:RecordingToken>
               <ns:Source>
                  <ns:SourceToken>[SourceToken_1]</ns:SourceToken>
               </ns:Source>
               <ns:StartTime>2024-06-10T12:00:00Z</ns:StartTime>
               <ns:StopTime>2024-06-10T13:00:00Z</ns:StopTime>
               <ns:Duration>3600</ns:Duration>
               <ns:Recurrence>...</ns:Recurrence>
               <ns:Content>
                  <ns:Description>...</ns:Description>
                  <ns:TotalBytes>...</ns:TotalBytes>
                  <ns:DataFrom>...</ns:DataFrom>
                  <ns:DataTo>...</ns:DataTo>
               </ns:Content>
            </ns:RecordingInformation>
            <!-- 可能有多个RecordingInformation元素 -->
         </ns:RecordingInformationList>
      </ns:FindRecordingsResponse>
   </soapenv:Body>
</soapenv:Envelope>

录像回放

        在Onvif中,回放时的音视频数据并不是通过SOAP报文传输的,但需要先通过SOAP请求获取到录像片段的回放URI,然后使用该URI进行媒体流的播放。GetReplayUri操作允许客户端请求获取一个录像片段的回放URI,其SOAP报文可以参考下面的示例报文。

        <ns:RecordingToken>:指定录像的唯一标识符,用于表示要回放的具体录像的Token。

        <ns:TrackToken>:可选参数,如果录像有多个轨道,可以用此参数指定要回放的特定轨道的Token。

        <ns:Protocol>:可选参数,指定期望的流媒体传输协议,比如RTSP、HTTP等。

        <ns:StreamingTransport>:可选参数,指定流媒体传输的底层传输协议,比如UDP、TCP等。

<soapenv:Envelope 
    xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
    xmlns:wsa="http://www.w3.org/2005/08/addressing"
    xmlns:ns="http://www.onvif.org/ver10/media/wsdl">
   <soapenv:Body>
      <ns:GetReplayUri>
         <ns:RecordingToken>[RecordingToken]</ns:RecordingToken>
         <!-- 可选参数 -->
         <ns:TrackToken>[TrackToken]</ns:TrackToken>
         <ns:Protocol>RTSP</ns:Protocol>
         <ns:StreamingTransport>UDP</ns:StreamingTransport>
      </ns:GetReplayUri>
   </soapenv:Body>
</soapenv:Envelope>

        设备收到GetReplayUri请求后,将返回一个包含录像回放URI的SOAP响应,具体可参考下面的示例报文。

        <ns:Uri>: 表示回放的URI,客户端可以直接使用此URI进行流媒体播放。

        <ns:InvalidAfterDateTime>: 表示该URI的有效期,超过此时间后,URI将不再可用。

<s:Envelope ...>
   <s:Body>
      <ns:GetReplayUriResponse>
         <ns:MediaUri>
            <ns:Uri>rtsp://[IP]:554/onvif-media/[StreamPath]</ns:Uri>
            <ns:InvalidAfterDateTime>2024-06-15T10:00:00Z</ns:InvalidAfterDateTime>
         </ns:MediaUri>
      </ns:GetReplayUriResponse>
   </s:Body>
</s:Envelope>

  • 51
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

希望_睿智

您的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值