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://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…