从零开始精通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:Envelopexmlns: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>
相关文章:
从零开始精通Onvif之录像存储
💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 概述 Onvif的录像存储功能主要由Media、Recording和Replay三个关键服务共同支持。它们协同工作,为录像的存储、检索和播放提供了标准…...
vue3面试题八股集合——2024
vue3比vue2有什么优势? 性能更好,打包体积更小,更好的ts支持,更好的代码组织,更好的逻辑抽离,更多的新功能 描述Vu3生命周期 Options API的生命周期: beforeCreate: 在实例初始化之后、数据观…...
第2章 Rust初体验5/8:match表达式和模式匹配:更富表达力:猜骰子冷热游戏
讲动人的故事,写懂人的代码 2.5 故事3: 比较答案与点数之和 贾克强:“同学们,我们开始用三种语言来实现故事3吧!” 2.5.1 Rust版故事3 这个故事实在是轻松容易地实现了。赵可菲照着书,一下子就写好了。 @@ -1,4 +1,5 @@use rand::Rng; +use std::cmp::Ordering;use std…...
1台UG图形工作站实现5-7人共享使用
随着计算机辅助设计(CAD)和计算机辅助制造(CAM)技术的不断发展,UG图形工作站已成为许多行业不可或缺的重要工具。 对于许多中小型企业而言,购买多台高性能的UG图形工作站无疑是一笔巨大的开销,…...
Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理
基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程,当然真正的服务远程引入、以及配置迁移啥的都还没讲,但是本次我们先不接着讲MigrationRuleListener#onRefer方法,而是先…...
nodejs——原型链污染
一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象的概念,所以我们要先明确一点: JavaScript中一切引用类型都是对象,对象就是属性的集合。 Array类型、Function类型、Object类型、Date类型、RegExp类型等都是引用类型。 也就…...
忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone
为了提高个人数据的安全性,用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能,但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码,您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…...
案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序
案例 Cacheable 是 Spring Framework 提供的一个注解,用于在方法执行前先检查缓存,如果缓存中已存在对应的值,则直接返回缓存中的值,而不执行该方法体。如果缓存中不存在对应的值,则执行方法体,并将方法的…...
第四届人工智能、机器人和通信国际会议(ICAIRC 2024)
第四届人工智能、机器人和通信国际会议(ICAIRC 2024) 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网:www.icairc.net 录用通知时间&…...
ctr/cvr预估之FM模型
ctr/cvr预估之FM模型 在数字化时代,广告和推荐系统的质量直接影响着企业的营销成效和用户体验。点击率(CTR)和转化率(CVR)预估作为这些系统的核心组件,其准确性至关重要。传统的机器学习方法,如…...
HAL-DMA中断空闲接受不定长数据
title: HAL-DMA中断空闲接受不定长数据 tags: STM32HalCubemax 面对无规律长度的数据帧如何处理? 不定长数据接收可以使用每帧数据发送完成后会有一定的空闲时间"帧的时间间隔?" 如果你想每帧都要可以采用dma加空闲中断的方式空闲中断一次就是一帧数据…...
【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)
第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会,广州番禺职业技术学院主办;全国区块链行业产教融合共同体,AEIC学术交流中心承办,将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…...
无引擎游戏开发(3):数据结构设计|功能函数完善
为了简单起见,我们将棋盘的二维数组定义为全局变量。除此之外还要定义一个char类型的全局变量来识别当前的落子类型,我们将其初始化为‘O’。 char Board_data[3][3] {{-, -, -},{-, -, -},{-, -, -}, };char Cur_piece O; 现在回到“读取操作”部分…...
Laravel 高级:了解$loop
Blade 提供 foreach、while、for 和 forelse 等指令来与 PHP 循环配合使用。 您知道吗... 这些指令中有一个方便的 $loop 变量,它指示当前循环迭代?在本文中,我们将探索 $loop 和 loop 指令。😎 使用$loop比foreach更深入 该for…...
深入理解指针(1)
目录: 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断⾔ 8. 指针的使⽤和传址调用 1. 内存和地址 1.1 内存 在讲内存和地址之前,我们想有个⽣活中的案例: 假设有⼀栋宿舍楼&a…...
在无线网中 2.4G、5G、WiFi6、WiFi7 都是什么意思?
有同学问我在无线网中 2.4G/5G/WiFi6/WiFi7 都是什么意思?其实这是两个概念, 2.4G/5G 是频段,WiFi6/WiFi7 是无线协议的版本,千万别把版本和频段搞混了。 WiFi 协议是一系列基于 IEEE 802.11 标准的无线局域网技术协议࿰…...
milvus元数据解析工具milvusmetagui介绍使用
简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具,milvus的元数据存储在etcd上,而且经过了序列化,通过etcd-manager这样的工具来查看是一堆二进制乱码,因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…...
LabVIEW电磁超声热态金属在线缺陷检测系统
LabVIEW软件开发的电磁超声热态金属在线缺陷检测系统针对极端高温环境下的金属材料,进行实时、无损的缺陷检测,具有高精度和高可靠性,能够显著提高材料质量控制的效率和准确性。 项目背景 随着工业技术的发展,高温环境下的金属材…...
leecode代码模板
二分算法: 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计…...
可靠性测试及模型计算
双85高温高湿测试 场景描述: 85℃温度 85%湿度 老化测试 目的: 衡量产品使用寿命 反向推导: 如何根据产品寿命及工况计算双85测试时间 模型介绍 本质是化学反应速率(老化的本质是)随温度的变化 温湿度循环测…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
