Elixir 通过 ExOnvif 库,Onvif 协议可以控制IP摄像机等设备,这篇文章记录:使用ExOnvif库,给视频流叠加文字,使用ExOnvif库的接口模块:ExOnvif.Media、ExOnvif.Media2。
ExOnvif官方文档

此文章内容:视频流叠加文字,关于Elixir通过ONVIF协议实现PTZ控制、视频流获取等指令,可以查看我的其他文章。点击查看主页

1. Media2和Media的核心关系:演进与替代

在 Onvif 协议中,Media2 是 Media 的升级版,

Media (Profile S): 是ONVIF基础版媒体服务,最早在ONVIF核心规范中定义。它提供了基本的视频流获取、快照、音频、视频编码配置等功能。绝大多数支持ONVIF的旧设备都实现了此服务。Media2 (Profile T): 是ONVIF第二代媒体服务,在 media 的基础上进行了重构和大幅增强。它是 Profile T 强制要求的标准服务。新发布的、功能更丰富的设备(尤其是支持H.265等新编码的设备)通常会同时支持 media 和 media2 或仅支持 media2。

关系总结: media2 并非要完全废弃 media,而是在保持向后兼容性的同时,提供了一个更先进的替代方案。两者在网络上可以共存。

2. 获取OSD

获取OSD有两种方式

  • get_osd(device, token) # get the osd by token
  • get_osds(device) # get the osds
    请添加图片描述
    请添加图片描述

设置OSD的方式

  • set_osd(device, osd) #set the osd
  • create_osd(device, osd) # create the osd
    请添加图片描述
    请添加图片描述

更新逻辑

  • 首先先通过get_osds函数获取所有的osds,
  • 取到需要更新的osd的token
  • 调用set或create函数,修改或创建新的osd text

3. 完整的代码示例

defmodule MvOnvif.Action douse GenServer@moduledoc """自定义的Onvif的部分协议获取当前状态(exonvifabsolute move调用摄像头到指定位置,continuous move摄像头连续移动调用指定预置位停止运动"""import ExOnvif.Utils.XmlBuilderimport SweetXmlalias ExOnvif.Devicealias ExOnvif.Media2# 初始化device设备defp get_device(uri) when not is_nil(uri) do%{host: host, userinfo: userinfo} =  URI.parse(uri)[user, pw] = String.split(userinfo, ":")Device.new("http://" <> host, user, pw);enddefp get_device(uri) do:errorend # 获取profiletoken标识符defp get_main_stream_profile_token(device) doprofiles = Media2.get_profiles(device)case profiles do{:ok, list} -> {:ok, hd(list).reference_token}_ -> "something went wrong"endend# 获取文字叠加def get_osds(uri) dowith {:ok, device} <- get_device(uri) doExOnvif.Media.get_osds(device)endend# 创建/更新 文字叠加def create_osd({ip, username, password}, text) dowith {:ok, device} <- get_device(ip, username, password),{:ok, profile_token} <- get_main_stream_profile_token(device),{:ok, source} <- ExOnvif.Media2.get_video_source_configurations(device, [profile_token: profile_token]),{:ok, osd_list} <- ExOnvif.Media.get_osds(device)do%{source_token: source_token} = hd(source) #默认取主视频流if length(osd_list) > 2 do  # 我取的是第三个osd%{token: osd_token} = List.last(osd_list)osd = make_osd(source_token, text, osd_token)ExOnvif.Media.set_osd(device, osd)elseosd = make_osd(source_token, text)ExOnvif.Media.create_osd(device, osd)endendend# %ExOnvif.Media.OSD实例defp make_osd(source_token, text \\ "", token \\ nil) do%ExOnvif.Media.OSD{token: token,video_source_configuration_token: source_token,text_string:  %ExOnvif.Media.OSD.TextString{is_persistent_text: true,type: :plain,plain_text: text},type: :text,position: %ExOnvif.Media.OSD.Position{type: :upper_left,pos: %{x: 21, y: 1}}}end
end

4. xml文件示例

获取osds的xml
<wsdl:GetOSDs><wsdl:ConfigurationToken>VideoSourceToken_1</wsdl:ConfigurationToken>
</wsdl:GetOSDs>
修改osd的xml
<SOAP-ENV:Body><wsdl:SetOSD><wsdl:OSDToken>OSDToken_001</wsdl:OSDToken> <!-- 要修改的OSD令牌 --><wsdl:OSD><tt:Position><tt:Pos><tt:x>0.85</tt:x><tt:y>0.05</tt:y></tt:Pos></tt:Position><tt:TextString><tt:FontSize>16</tt:FontSize><tt:FontColor>0xFF0000</tt:FontColor> <!-- 改为红色 --><tt:PlainText>MAIN GATE - CAM01</tt:PlainText></tt:TextString></wsdl:OSD></wsdl:SetOSD>
</SOAP-ENV:Body>
创建osd的xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelopexmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"xmlns:wsdl="http://www.onvif.org/ver20/device/wsdl"xmlns:tt="http://www.onvif.org/ver10/schema"><SOAP-ENV:Header><!-- 安全认证头(同前) --></SOAP-ENV:Header><SOAP-ENV:Body><wsdl:CreateOSD><wsdl:OSD><tt:VideoSourceConfigurationToken>VideoSourceToken_1</tt:VideoSourceConfigurationToken><tt:Type>Text</tt:Type><tt:Position><tt:Type>Custom</tt:Type> <!--UpperLeft/UpperRight/LowerLeft/LowerRight --><tt:Pos><tt:x>0.8</tt:x> <!-- 0-1.0 水平位置 --><tt:y>0.1</tt:y> <!-- 0-1.0 垂直位置 --></tt:Pos></tt:Position><tt:TextString><tt:Type>Plain</tt:Type> <!--Date/Time/DateAndTime --><tt:DateFormat>yyyy-MM-dd</tt:DateFormat><tt:TimeFormat>HH:mm:ss</tt:TimeFormat><tt:FontSize>14</tt:FontSize><tt:FontColor>0x00FF00</tt:FontColor> <!-- RGB 格式: 0xRRGGBB --><tt:BackgroundColor>0x000000</tt:BackgroundColor><tt:PlainText>Camera 01 - Main Gate</tt:PlainText><tt:Extension><tt:IsPersistentText>true</tt:IsPersistentText></tt:Extension></tt:TextString></wsdl:OSD></wsdl:CreateOSD></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96241.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96241.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96241.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线程安全相关的注解

主要有下面三个加在类上的线程安全相关的注解。一.Immutable标记一个类为不可变的。这意味着该类的实例在构造完成后&#xff0c;其状态&#xff08;数据&#xff09;永远不能被更改。实现不可变性的严格条件&#xff08;Java内存模型中的定义&#xff09;&#xff1a;所有字段…

基于Springboot + vue3实现的在线智慧考公系统

项目描述本系统包含管理员、教师、用户三个角色。管理员角色&#xff1a;用户管理&#xff1a;管理系统中所有用户的信息&#xff0c;包括添加、删除和修改用户。配置管理&#xff1a;管理系统配置参数&#xff0c;如上传图片的路径等。权限管理&#xff1a;分配和管理不同角色…

赋能高效设计:12套中后台管理信息系统通用原型框架

中后台管理信息系统是企业数字化转型的核心引擎&#xff0c;肩负着提升运营效率、赋能精准决策的重任。面对多样化的业务场景和复杂的逻辑需求&#xff0c;如何快速、高质量地完成系统设计与原型构建&#xff0c;成为产品、设计与开发团队共同面临的挑战。 为此&#xff0c;一套…

LangGraph中ReAct模式的深度解析:推理与行动的完美融合——从理论到实践的智能Agent构建指南

在人工智能的演进历程中&#xff0c;ReAct&#xff08;Reasoning and Acting&#xff09;模式无疑是最具革命性的突破之一。它不仅仅是一种技术实现&#xff0c;更是对智能Agent思维模式的深刻重构。而LangGraph&#xff0c;作为这一理念的优秀实践者&#xff0c;将ReAct模式演…

蜂窝物联网模组在换电柜场景的发展前景分析

蜂窝物联网模组在换电柜场景中正迎来爆发式增长机遇&#xff0c;特别是在Cat.1技术路线主导的市场格局下&#xff0c;其应用价值已从基础通信服务拓展至安全监测、智能管理、电池溯源等核心领域&#xff0c;成为换电柜行业标准化、智能化升级的关键技术支撑。随着2025年新国标全…

机器学习之K折交叉验证

为了更好的评估机器学习训练出模型的泛化能力&#xff0c;即避免模型在训练集上表现良好&#xff0c;但在未见过的数据上表现不佳&#xff08;即过拟合&#xff09;&#xff0c;同时也减少了单一训练/测试集划分带来的随机性影响。一、什么是K折交叉验证&#xff1f;1、将数据集…

详细解读k8s的kind中service与pod的区别

Pod 是运行应用实例的“容器”&#xff0c;而 Service 是访问这些 Pod 的“稳定网络门户”。Pod&#xff08;容器组&#xff09;1. 核心概念&#xff1a; Pod 是 Kubernetes 中可以创建和管理的最小、最简单的计算单元。一个 Pod 代表集群上正在运行的一个工作负载实例。2. 职责…

python---PyInstaller(将Python脚本打包为可执行文件)

在Python开发中&#xff0c;我们常需要将脚本分享给不熟悉Python环境的用户。此时&#xff0c;直接提供.py文件需要对方安装Python解释器和依赖库&#xff0c;操作繁琐。PyInstaller作为一款主流的Python打包工具&#xff0c;能将脚本及其依赖打包为单个可执行文件&#xff08;…

利用归并算法对链表进行排序

/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };这里是链…

论文阅读_大模型情绪分析预测股票趋势

英文名称&#xff1a;Stock Price Trend Prediction using Emotion Analysis of Financial Headlines with Distilled LLM Model 中文名称&#xff1a;利用蒸馏大型语言模型对财务新闻标题情绪分析以预测股价趋势 链接: https://dl.acm.org/doi/pdf/10.1145/3652037.3652076作…

websocket和socket区别

websocket和socket区别&#xff0c;这是一个非常经典的问题。简单来说&#xff0c;Socket 是构建网络通信的工具和基础&#xff0c;而 WebSocket 是建立在它之上的一种具体的通信协议。可以把它们的关系想象成&#xff1a;Socket 像是修路和建立交通规则的基础工程。它定义了车…

网络复习1

1.网络协议栈 一般一个主机内的应用&#xff08;进程&#xff09;进行通信&#xff0c;直接在操作系统层面进行 进程交互即可。而不同位置两台主机进行通信需要通过网线传输信号&#xff0c;因此 这些通信的数据为网络数据&#xff0c;而网络数据进程传输必须从应用层依次向下…

AFSim2.9.0学习笔记 —— 4.2、ArkSIM文件结构介绍及项目结构整理

&#x1f514; AFSim2.9.0 相关技术、疑难杂症文章合集&#xff08;掌握后可自封大侠 ⓿_⓿&#xff09;&#xff08;记得收藏&#xff0c;持续更新中…&#xff09; 若还没有下载AFSim2.9.0完整软件或源码&#xff0c;请先进入本人另篇文章了解下载。 文章概要 本文主要对上篇…

hbuilderx配置微信小程序开发环境

hbuilderx配置微信小程序开发环境 借鉴HbuilderX微信开发者工具配置_hbuilder和微信开发者工具-CSDN博客 在微信开发者工具的设置选项的安全设置打开服务端口 在hbuidex的工具的设置选项的运行配置的微信开发者工具路径的方框输入 D:/software/wxchatmini 方可成功&#xf…

AUTOSAR Adaptive Platform 日志与追踪 (Log and Trace) 规范深度解析

<摘要> [R22-11 AUTOSAR Adaptive Platform (AP) 日志规范是AUTOSAR标准体系中针对高性能计算域&#xff08;如自动驾驶、智能座舱&#xff09;的关键组成部分。本文对AUTOSAR AP日志与追踪&#xff08;Log and Trace, LT&#xff09;进行了系统性解析&#xff0c;涵盖了…

[硬件电路-179]:集成运放,虚短的是电压,虚断的是电流

集成运放&#xff08;运算放大器&#xff09;中的“虚短”和“虚断”是分析其线性应用&#xff08;如反相放大器、同相放大器等&#xff09;时的两个核心概念&#xff0c;它们分别描述了运放输入端的电压和电流特性。以下是详细解释&#xff1a;1. 虚短&#xff08;Virtual Sho…

Redis常见问题及其处理策略

TODO&#xff1a;待重新整理 资源稳定性保障&#xff08;以Redis为例&#xff09;&#xff1a;核心指标、常见问题及处理策略 一、资源稳定性核心参考指标 在资源本身的稳定性保障中&#xff0c;常见核心监控指标包括&#xff1a; CPU&#xff1a;计算资源负载&#xff0c;…

微算法科技(NASDAQ: MLGO)结合子阵列算法,创建基于区块链的动态信任管理模型

随着分布式系统在物联网、供应链金融、去中心化存储等领域的广泛应用&#xff0c;节点间信任评估的高效性与安全性成为核心挑战。传统中心化信任机制存在单点故障、数据篡改风险及扩展性不足等问题&#xff0c;难以适应大规模动态网络需求。区块链技术凭借其去中心化、不可篡改…

【展厅多媒体】从技术到体验,AR在展厅中的一体化整合

AR增强现实正在重塑现代展厅的体验范式&#xff0c;为观众创造虚实交融的沉浸式环境。这项技术通过计算机视觉与图形学算法&#xff0c;将数字信息精准叠加于真实空间&#xff0c;从而实现超越物理限制的叙事可能。 在展厅环境中&#xff0c;AR增强现实技术的有效实施&#xf…

人工智能机器学习——模型评价及优化

一、欠拟合与过拟合二、数据分离与混淆矩阵混淆矩阵(Confusion Matrix)混淆矩阵&#xff0c;又称为误差矩阵&#xff0c;用于衡量分类算法的准确程度二、模型优化四、实战准备五、酶活性预测&#xff0c;使用数据集T-R-train.csv&#xff0c;测试集T-R-test.csv #加载数据 impo…