当前位置: 首页 > 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;随温度的变化 温湿度循环测…...

突破2048游戏瓶颈:AI助手的全方位策略支持

突破2048游戏瓶颈&#xff1a;AI助手的全方位策略支持 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 为何数字方块总是难以合并到2048&#xff1f; 你是否曾在2048游戏中遭遇这样的困境&#xff1a;屏幕上的数字…...

Nunchaku FLUX.1-dev 结合Transformer架构:提升图像生成一致性与细节

Nunchaku FLUX.1-dev 结合Transformer架构&#xff1a;提升图像生成一致性与细节 最近在尝试各种文生图模型时&#xff0c;我发现了一个挺有意思的现象&#xff1a;很多模型在处理简单描述时表现不错&#xff0c;但一旦遇到包含多个对象、复杂关系或者长段描述的提示词&#x…...

【ComfyUI】Qwen-Image-Edit-F2P 环境配置全攻略:Anaconda创建独立Python环境

ComfyUI Qwen-Image-Edit-F2P 环境配置全攻略&#xff1a;Anaconda创建独立Python环境 你是不是也遇到过这种情况&#xff1a;好不容易找到一个好用的AI图像编辑模型&#xff0c;比如Qwen-Image-Edit-F2P&#xff0c;兴冲冲地准备在ComfyUI里跑起来&#xff0c;结果第一步安装…...

泛微E9流程表单转PDF/HTML实战:手把手教你集成档案系统(附完整代码)

泛微E9流程表单转PDF/HTML全流程开发指南&#xff1a;从原理到实战 在企业管理数字化转型的浪潮中&#xff0c;OA系统与档案系统的无缝对接已成为提升组织效能的刚需。作为国内主流的协同办公平台&#xff0c;泛微E9的流程表单承载着企业核心业务流程数据&#xff0c;如何将这些…...

利用快马ai快速生成c语言语法学习原型,直观掌握编程基础

今天想和大家分享一个特别实用的C语言学习小技巧。作为一个编程新手&#xff0c;我最近发现用InsCode(快马)平台可以快速搭建C语言学习原型&#xff0c;把抽象的概念变成看得见、能运行的代码&#xff0c;学习效果特别好。 为什么要用原型学习法 刚开始学C语言时&#xff0c;最…...

FireRedASR Pro模型架构浅析:从卷积神经网络到端到端设计

FireRedASR Pro模型架构浅析&#xff1a;从卷积神经网络到端到端设计 最近在语音识别圈子里&#xff0c;FireRedASR Pro这个名字被提到的次数越来越多了。不少朋友都在问&#xff0c;这个模型到底有什么特别之处&#xff0c;为什么大家都在讨论它。其实&#xff0c;它的核心魅…...

Ubuntu16.04服务器上从零部署LaneNet车道线检测:Tusimple数据集处理全流程避坑指南

Ubuntu 16.04服务器部署LaneNet车道线检测全流程实战 在自动驾驶和智能交通系统中&#xff0c;车道线检测是一项基础而关键的技术。本文将详细介绍如何在Ubuntu 16.04服务器环境下&#xff0c;从零开始部署LaneNet车道线检测模型&#xff0c;并处理Tusimple数据集的全流程。不同…...

vLLM-v0.17.1参数详解:--enforce-eager --disable-custom-all-reduce说明

vLLM-v0.17.1参数详解&#xff1a;--enforce-eager --disable-custom-all-reduce说明 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的吞吐量和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff…...

Project Sistine核心代码剖析:从图像分割到鼠标事件模拟

Project Sistine核心代码剖析&#xff1a;从图像分割到鼠标事件模拟 【免费下载链接】sistine Turn a MacBook into a Touchscreen with $1 of Hardware 项目地址: https://gitcode.com/gh_mirrors/si/sistine Project Sistine是一个创新的开源项目&#xff0c;它能让普…...

数据库课程设计案例:基于深度感知的智能仓储管理系统

数据库课程设计案例&#xff1a;基于深度感知的智能仓储管理系统 每次路过大型物流仓库&#xff0c;看到那些高耸的货架和穿梭的叉车&#xff0c;我总会想&#xff0c;他们是怎么知道哪个货位是满的&#xff0c;哪个是空的&#xff1f;靠人工盘点&#xff1f;那得累死。靠传统…...