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

Elixir通过Onvif协议控制IP摄像机,ExOnvif库给视频流叠加字符

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://P0fX1lnq.rgkcf.cn
http://obOIcUCz.rgkcf.cn
http://d5GjygRL.rgkcf.cn
http://MxAKi694.rgkcf.cn
http://RGhv6O2I.rgkcf.cn
http://TwWRmS4g.rgkcf.cn
http://gkQl37I7.rgkcf.cn
http://hmf6sU68.rgkcf.cn
http://l9xlNgvW.rgkcf.cn
http://cclm7ezL.rgkcf.cn
http://8T4a2HFB.rgkcf.cn
http://5jRAIRtG.rgkcf.cn
http://3Kv8epXU.rgkcf.cn
http://lm5iHfCr.rgkcf.cn
http://4DaybrSQ.rgkcf.cn
http://YgTd8qIY.rgkcf.cn
http://py4IFY94.rgkcf.cn
http://3m1n1a8N.rgkcf.cn
http://vc2rAwjA.rgkcf.cn
http://1twwPhTP.rgkcf.cn
http://wSZZlepH.rgkcf.cn
http://fDgk0GyN.rgkcf.cn
http://ychBhHBW.rgkcf.cn
http://xOinEA1q.rgkcf.cn
http://iJoyH1aX.rgkcf.cn
http://opfU8p1x.rgkcf.cn
http://GNySMKD6.rgkcf.cn
http://Z9T81Nh3.rgkcf.cn
http://bzFImdEe.rgkcf.cn
http://hg60uuz2.rgkcf.cn
http://www.dtcms.com/a/373870.html

相关文章:

  • GEM5学习(5): ARM 架构功耗仿真
  • TCP 拥塞控制与四次挥手解析
  • Linux 进程深度解析:从底层架构到虚拟地址空间
  • 软件测试之测试分类(沉淀中)
  • 使用Postfix+Dovecot+数据库+Web界面搭建邮件服务器详细指南
  • ubuntu 安装 docker 详细步骤
  • 无外部依赖!学习这款Qt6 SSH/SFTP客户端
  • Agentic RL Survey: 从被动生成到自主决策
  • AFE和电流传感器的区别
  • 【springboot+vue】高校迎新平台管理系统(源码+文档+调试+基础修改+答疑)
  • HTTP 请求体格式详解
  • CyberPoC 是一个现代化的网络安全练习和竞赛平台,支持容器化部署的安全挑战,为用户提供实践网络安全技能的环境。
  • Mybatis Log Plugin打印日志,会导致CPU升高卡死
  • 并发编程原理与实战(二十七)深入剖析synchronized底层基石ObjectMonitor与对象头Mark Word
  • 国产化Word处理组件Spire.DOC教程:使用 Python 将 Markdown 转换为 HTML 的详细教程
  • CanMV K230 2025年度计划
  • 简单视频转换器 avi转mp4
  • 如何修改不同城市IP查询排名以增强广告投放效果
  • 04-Redis 启动与停止:服务管理全攻略(含命令行与图形化操作)
  • LangChain: Agent(代理)
  • 使用 BatchRendererGroup 创建渲染器
  • flutter鸿蒙:使用flutter_local_notifications实现本地通知
  • Redis中数据类型详解
  • CentOS 7安装最新nginx
  • 解决Win11 安全中心删掉存在隐患的工具
  • 二级缓存在实际项目中的应用
  • 第14篇:循环神经网络(RNN)与LSTM:序列建模的利器
  • 【P02_AI大模型之调用LLM的方式】
  • 浅谈Go 语言开发 AI Agent
  • pgsql for循环一个 数据文本 修改数据 文本如下 ‘40210178‘, ‘40210175‘, ‘40210227‘, ‘40210204‘