当前位置: 首页 > news >正文

从零开始精通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之录像存储

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 概述 Onvif的录像存储功能主要由Media、Recording和Replay三个关键服务共同支持。它们协同工作&#xff0c;为录像的存储、检索和播放提供了标准…...

vue3面试题八股集合——2024

vue3比vue2有什么优势&#xff1f; 性能更好&#xff0c;打包体积更小&#xff0c;更好的ts支持&#xff0c;更好的代码组织&#xff0c;更好的逻辑抽离&#xff0c;更多的新功能 描述Vu3生命周期 Options API的生命周期&#xff1a; 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人共享使用

随着计算机辅助设计&#xff08;CAD&#xff09;和计算机辅助制造&#xff08;CAM&#xff09;技术的不断发展&#xff0c;UG图形工作站已成为许多行业不可或缺的重要工具。 对于许多中小型企业而言&#xff0c;购买多台高性能的UG图形工作站无疑是一笔巨大的开销&#xff0c;…...

Dubbo 3.x源码(22)—Dubbo服务引用源码(5)服务引用bean的获取以及懒加载原理

基于Dubbo 3.1&#xff0c;详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了Dubbo3.1版本的服务引入的总体流程&#xff0c;当然真正的服务远程引入、以及配置迁移啥的都还没讲&#xff0c;但是本次我们先不接着讲MigrationRuleListener#onRefer方法&#xff0c;而是先…...

nodejs——原型链污染

一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象的概念&#xff0c;所以我们要先明确一点&#xff1a; JavaScript中一切引用类型都是对象&#xff0c;对象就是属性的集合。 Array类型、Function类型、Object类型、Date类型、RegExp类型等都是引用类型。 也就…...

忘记 iPhone 密码:如果忘记密码,如何解锁 iPhone

为了提高个人数据的安全性&#xff0c;用户通常会为不同的帐户和设备创建不同的复杂密码。虽然较新的 iPhone 型号具有生物识别和面部解锁功能&#xff0c;但这些功能并不总是有效 - 如果您忘记了 iPhone 的密码&#xff0c;您可能会遇到麻烦。 iPhone 用户和 Android 用户一样…...

案例 采用Springboot默认的缓存方案Simple在三层架构中完成一个手机验证码生成校验的程序

案例 Cacheable 是 Spring Framework 提供的一个注解&#xff0c;用于在方法执行前先检查缓存&#xff0c;如果缓存中已存在对应的值&#xff0c;则直接返回缓存中的值&#xff0c;而不执行该方法体。如果缓存中不存在对应的值&#xff0c;则执行方法体&#xff0c;并将方法的…...

第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 重要信息 会议官网&#xff1a;www.icairc.net 录用通知时间&…...

ctr/cvr预估之FM模型

ctr/cvr预估之FM模型 在数字化时代&#xff0c;广告和推荐系统的质量直接影响着企业的营销成效和用户体验。点击率&#xff08;CTR&#xff09;和转化率&#xff08;CVR&#xff09;预估作为这些系统的核心组件&#xff0c;其准确性至关重要。传统的机器学习方法&#xff0c;如…...

HAL-DMA中断空闲接受不定长数据

title: HAL-DMA中断空闲接受不定长数据 tags: STM32HalCubemax 面对无规律长度的数据帧如何处理&#xff1f; 不定长数据接收可以使用每帧数据发送完成后会有一定的空闲时间"帧的时间间隔?" 如果你想每帧都要可以采用dma加空闲中断的方式空闲中断一次就是一帧数据…...

【会议征稿,CPS出版】第四届管理科学和软件工程国际学术会议(ICMSSE 2024,7月19-21)

第四届管理科学和软件工程国际学术会议(ICMSSE 2024)由ACM珠海分会&#xff0c;广州番禺职业技术学院主办&#xff1b;全国区块链行业产教融合共同体&#xff0c;AEIC学术交流中心承办&#xff0c;将于2024年7月19-21日于广州召开。 会议旨在为从事管理与软件工程领域的专家学…...

无引擎游戏开发(3):数据结构设计|功能函数完善

为了简单起见&#xff0c;我们将棋盘的二维数组定义为全局变量。除此之外还要定义一个char类型的全局变量来识别当前的落子类型&#xff0c;我们将其初始化为‘O’。 char Board_data[3][3] {{-, -, -},{-, -, -},{-, -, -}, };char Cur_piece O; 现在回到“读取操作”部分…...

Laravel 高级:了解$loop

Blade 提供 foreach、while、for 和 forelse 等指令来与 PHP 循环配合使用。 您知道吗... 这些指令中有一个方便的 $loop 变量&#xff0c;它指示当前循环迭代&#xff1f;在本文中&#xff0c;我们将探索 $loop 和 loop 指令。&#x1f60e; 使用$loop比foreach更深入 该for…...

深入理解指针(1)

目录&#xff1a; 1. 内存和地址 2. 指针变量和地址 3. 指针变量类型的意义 4. const修饰指针 5. 指针运算 6. 野指针 7. assert断⾔ 8. 指针的使⽤和传址调用 1. 内存和地址 1.1 内存 在讲内存和地址之前&#xff0c;我们想有个⽣活中的案例&#xff1a; 假设有⼀栋宿舍楼&a…...

在无线网中 2.4G、5G、WiFi6、WiFi7 都是什么意思?

有同学问我在无线网中 2.4G/5G/WiFi6/WiFi7 都是什么意思&#xff1f;其实这是两个概念&#xff0c; 2.4G/5G 是频段&#xff0c;WiFi6/WiFi7 是无线协议的版本&#xff0c;千万别把版本和频段搞混了。 WiFi 协议是一系列基于 IEEE 802.11 标准的无线局域网技术协议&#xff0…...

milvus元数据解析工具milvusmetagui介绍使用

简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具&#xff0c;milvus的元数据存储在etcd上&#xff0c;而且经过了序列化&#xff0c;通过etcd-manager这样的工具来查看是一堆二进制乱码&#xff0c;因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…...

LabVIEW电磁超声热态金属在线缺陷检测系统

LabVIEW软件开发的电磁超声热态金属在线缺陷检测系统针对极端高温环境下的金属材料&#xff0c;进行实时、无损的缺陷检测&#xff0c;具有高精度和高可靠性&#xff0c;能够显著提高材料质量控制的效率和准确性。 项目背景 随着工业技术的发展&#xff0c;高温环境下的金属材…...

leecode代码模板

二分算法&#xff1a; 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。你必须设计…...

可靠性测试及模型计算

双85高温高湿测试 场景描述&#xff1a; 85℃温度 85%湿度 老化测试 目的&#xff1a; 衡量产品使用寿命 反向推导&#xff1a; 如何根据产品寿命及工况计算双85测试时间 模型介绍 本质是化学反应速率&#xff08;老化的本质是&#xff09;随温度的变化 温湿度循环测…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

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…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...