又是全網首創/純Qt實現28181設備模擬器/rtp視頻點播/桌面轉28181/任意文件轉28181/跨平臺

一、前言說明

這個工具前前后后也算是廢了不少功夫,最開始是因為28181服務端的組件已經完美實現,對照國標文檔看了很多遍,逐個實現需要的交互協議,整體上比onvif協議要難不少,主要是涉及到的東西比較多,有sip協議,又有xml數據封裝,云臺控制用的又是模擬設備時代的16進制數據來控制,音視頻傳輸用的又是單獨的rtp,而播放控制用的又是rtsp中的控制指令,哎呀我去全部雜交啊,一般人沒個幾個月搞不定的,發量越來越少是肯定的。

能夠把28181的服務端搞定,那設備端的指令就簡單多了,底層其實就是udp和tcp通信,根據收到的數據進行解析和交互即可,按照國標文檔來就行,肯定錯不了,如果錯了那肯定是對應平臺或者設備廠家有問題沒寫好。設備端最大難點困在如何發送視頻rtp數據這里,一直在想要不要用第三方的輪子比如jrtp,好在之前就對ffmpeg推流很熟悉了,嘗試了直接推流rtp,一開始死活不行,后面發現原來格式不對,國標要求的是rtp攜帶ts格式的數據包,對應不應該是rtp格式而應該是rtp_mpegts,相當于rtp over mpegts,其實udp推流這種就是mpegts格式,這個細節網上很少人提到,搞得這里困了很多天,以為ffmpeg實現不了,原來用純ffmpeg就可以直接實現的。

二、效果圖

在這里插入圖片描述
在這里插入圖片描述

三、相關地址

  1. 國內站點:https://gitee.com/feiyangqingyun
  2. 國際站點:https://github.com/feiyangqingyun
  3. 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_simulate。

四、功能特點

  1. 標準onvif協議,支持設備搜索、獲取參數、快照抓圖等。
  2. 支持264/265/aac等標準視音頻協議傳輸。
  3. 支持多路批量onvif設備模擬,每一路都獨立的端口。
  4. 支持本地攝像頭采集轉成onvif,可選擇不同的設備、分辨率、幀率等參數。
  5. 支持本地桌面采集轉成onvif,可選擇不同的屏幕、分辨率、幀率等參數。
  6. 支持各種視頻文件和視頻流轉成onvif,可重新設置編碼轉換以及分辨率轉換。
  7. 支持4K、8K等高清分辨率,不限制分辨率,非264/265會自動轉碼推流。
  8. 每一路都可以設置統一或者獨立的用戶驗證信息,為空則表示不驗證。
  9. 可以把任意內容接入到NVR以及視頻監控系統,方便保存錄像文件,以便回放可查。
  10. 也可作為壓力測試工具,比如模擬幾千路onvif設備,讓集成平臺軟件做接入壓力測試。
  11. 推出去的流不僅有rtsp格式,還支持rtmp、http、flv、ws-flv、webrtc等方式訪問,可以直接網頁查看。
  12. 在管理工具上可以看到每一路的推流狀況以及分辨率信息,非常直觀。
  13. 支持自動重連拉流,重連推流,保證7乘以24小時穩定運行。
  14. 可設置開機自啟動運行和后臺運行,不顯示在任務欄,作為后臺服務運行。
  15. 可批量添加文件、添加目錄,自動將目錄下的所有文件添加到模擬器。
  16. 多功能添加地址面板,可以選擇本地設備和監控設備,本地設備會自動識別攝像頭設備和桌面設備,監控設備可以選擇不同廠家,自動填充對應rtsp格式,填入用戶信息即可,可以批量遞增添加監控設備。
  17. 可無縫上傳到市面上所有的onvif協議設備,包括海康、大華、宇視、華為、天地偉業等,也支持ONVIF Device Manager國際onvif工具。
  18. 支持gb28181設備模擬,具備設備注冊、設備注銷、設備心跳、設備信息、設備配置、設備狀態應答等。
  19. 支持模擬報警和位置上報等,方便平臺側顯示對應設備的實時位置。
  20. 支持一鍵添加批量模擬28181設備,實時顯示已注冊和已注銷狀態。
  21. 支持將本地桌面、本地攝像頭、任意視頻文件、視頻流文件、手機攝像頭等轉換成28181設備,添加到NVR或者國標軟件平臺。
  22. sip協議同時支持udp和tcp兩種通信方式,視頻點播同時支持udp/tcp主動/tcp被動三種方式,涵蓋所有可能的場景需求。
  23. 無論是onvif設備模擬組件還是28181設備模擬組件,全部原創底層協議解析,純Qt實現,跨任意平臺。
  24. 代碼結構框架非常清晰,注釋詳細,代碼精簡不繁瑣,非常易于學習和移植,可以很容易拓展其他接口需求。
  25. 支持Qt4/Qt5/Qt6以及后續所有版本、所有編譯器、所有開發環境。
  26. 支持windows、linux、mac、國產OS、嵌入式linux、RK3588、樹莓派、香橙派等系統。

五、相關代碼

#include "gb28181devicepush.h"
#include "ffmpegthread.h"
#include "ffmpegsave.h"
#include "videohelper.h"
#include "osdgraph.h"bool GB28181DevicePush::disableDecode = true;
GB28181DevicePush::GB28181DevicePush(QObject *parent) : QObject(parent)
{ffmpegThread = NULL;
}GB28181DevicePush::~GB28181DevicePush()
{this->stop();
}void GB28181DevicePush::setPara(const QString &flag, const QString &mediaUrl, const QString &pushUrl)
{this->flag = flag;this->mediaUrl = mediaUrl;this->pushUrl = pushUrl;
}bool GB28181DevicePush::isOk()
{return (ffmpegThread != NULL);
}void GB28181DevicePush::start()
{if (ffmpegThread || mediaUrl.isEmpty() || pushUrl.isEmpty()) {return;}//實例化視頻采集線程ffmpegThread = new FFmpegThread;//關聯播放開始信號/用來啟動推流connect(ffmpegThread, SIGNAL(receivePlayStart(int)), this, SLOT(receivePlayStart(int)));//關聯錄制信號變化/用來判斷是否推流成功connect(ffmpegThread, SIGNAL(recorderStateChanged(RecorderState, QString)), this, SLOT(recorderStateChanged(RecorderState, QString)));//設置保存視頻類將數據包信號發出來用于保存文件FFmpegSave *saveFile = ffmpegThread->getSaveFile();saveFile->setProperty("ssrc", flag);connect(saveFile, SIGNAL(receiveSaveStart()), this, SLOT(receiveSaveStart()));connect(saveFile, SIGNAL(receiveSaveFinsh()), this, SLOT(receiveSaveFinsh()));connect(saveFile, SIGNAL(receiveSaveError(int)), this, SLOT(receiveSaveError(int)));    //設置播放地址ffmpegThread->setMediaUrl(mediaUrl);//設置視頻模式ffmpegThread->setVideoMode(VideoMode_Painter);//設置讀取超時時間超時后會自動重連ffmpegThread->setReadTimeout(10 * 1000);//設置連接超時時間ffmpegThread->setConnectTimeout(0);//設置重復播放相當于循環推流ffmpegThread->setPlayRepeat(true);//設置不解碼音頻ffmpegThread->setDecodeAudio(false);//設置不解碼數據ffmpegThread->setDisableDecode(disableDecode);//如果是本地設備或者桌面錄屏要取出其他參數VideoHelper::initVideoPara(ffmpegThread, mediaUrl);//啟動播放ffmpegThread->play();
}void GB28181DevicePush::stop()
{//停止推流和采集并徹底釋放對象if (ffmpegThread) {ffmpegThread->recordStop();ffmpegThread->stop();ffmpegThread->deleteLater();ffmpegThread = NULL;}
}void GB28181DevicePush::receivePlayStart(int time)
{//演示添加OSD后推流
#ifdef betaversionint height = ffmpegThread->getVideoHeight();QList<OsdInfo> osds = OsdGraph::getTestOsd(height);ffmpegThread->setOsdInfo(osds);
#endif//打開后才能啟動錄像ffmpegThread->recordStart(pushUrl);
}void GB28181DevicePush::recorderStateChanged(const RecorderState &state, const QString &)
{int width = 0;int height = 0;if (ffmpegThread) {width = ffmpegThread->getVideoWidth();height = ffmpegThread->getVideoHeight();}bool start = (state == RecorderState_Recording);emit pushStart(flag, width, height, start);
}void GB28181DevicePush::receiveSaveStart()
{emit pushChanged(flag, 0);
}void GB28181DevicePush::receiveSaveFinsh()
{emit pushChanged(flag, 1);
}void GB28181DevicePush::receiveSaveError(int)
{emit pushChanged(flag, 2);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96271.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96271.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96271.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓逆向(一)Ubuntu環境配置

一、Ubuntu 1、虛擬機 首先準備一個Ubuntu的虛擬機&#xff0c;就隨便新建一個就行&#xff0c;我這里使用的是Ubuntu21.04&#xff0c;但是內存跟硬盤大小最好設置的稍微大一點。 2、基礎環境 &#xff08;1&#xff09;解決apt-get update報錯問題 apt-get是Linux系統中一個管…

Go 1.25在性能方面做了哪些提升?

Go 1.25 在性能方面帶來了多項重要提升&#xff0c;主要有以下幾個方面&#xff1a; 實驗性垃圾回收器 GreenTea GC&#xff1a;針對小對象密集型應用優化&#xff0c;顯著提升小對象標記和掃描性能&#xff0c;垃圾回收開銷減少0-40%&#xff0c;暫停時間縮短&#xff0c;吞吐…

Python與XML文件處理詳解(2續):xml.dom.minidom模塊高階使用方法

目錄 第一部分:高級節點操作與遍歷方法 1.1 更精確的節點導航 1.2 使用 cloneNode() 復制節點 1.3 節點插入、替換與高級管理 第二部分:文檔創建與高級輸出控制 2.1 使用 Document 工廠方法完整創建文檔 2.2 高級輸出與序列化控制 第三部分:實用工具函數與模式處理 …

如何利用 ChatGPT 輔助寫作

引言 介紹人工智能輔助寫作的興起&#xff0c;ChatGPT 在寫作領域的應用潛力&#xff0c;以及本文的核心目標。 ChatGPT 在寫作中的核心功能 概述 ChatGPT 的主要功能&#xff0c;包括文本生成、潤色、結構優化、靈感激發等。 利用 ChatGPT 輔助寫作的具體方法 生成創意與靈感 …

【有鹿機器人自述】我在社區的365天:掃地、賣萌、治愈人心

大家好&#xff0c;我是有鹿巡掃機器人&#xff0c;編號RD-07。今天我想和大家分享這一年來的工作見聞——沒錯&#xff0c;我們機器人也會"觀察"和"感受"&#xff0c;尤其是在連合直租將我送到這個社區后&#xff0c;發生的點點滴滴讓我擁有了前所未有的&…

第五十五天(SQL注入增刪改查HTTP頭UAXFFRefererCookie無回顯報錯復盤)

#數據庫知識&#xff1a; 1、數據庫名&#xff0c;表名&#xff0c;列名&#xff0c;數據 2、自帶數據庫&#xff0c;數據庫用戶及權限 3、數據庫敏感函數&#xff0c;默認端口及應用 4、數據庫查詢方法&#xff08;增加刪除修改更新&#xff09; #SQL注入產生原理&#xf…

怎么用 tauri 創建一個桌面應用程序(Electron)

以前用 Electron 做過一個桌面應用程序&#xff0c;打包體積確實很大&#xff0c;啟動也很慢。這次先 tauri。 并且用 bun 代替 npm 速度更快&#xff0c;避免總是出現依賴問題。 前端用 react 為了學習下&#xff0c;用 js 先現在主流的 typescript。 安裝 bun npm instal…

【通過Docker快速部署Tomcat9.0】

文章目錄前言一、部署docker二、部署Tomcat2.1 創建存儲卷2.2 運行tomcat容器2.3 查看tomcat容器2.4 查看端口是否監聽2.5 防火墻開放端口三、訪問Tomcat前言 Tomcat介紹 Tomcat 是由 Apache 軟件基金會&#xff08;Apache Software Foundation&#xff09;開發的一個開源 Jav…

LabVIEW UI 分辨率適配

針對 LabVIEW UI 在不同分辨率下的適配&#xff0c;現有方案分三類&#xff1a;一是現有 VI 可通過 “VI 屬性 - 窗口大小” 勾選比例保持或控件縮放選項快速調整&#xff0c;也可取消勾選或換等寬字體防控件移位&#xff1b;二是項目初期以最低目標分辨率為基準&#xff0c;用…

國產化FPGA開發板:2050-基于JFMK50T4(XC7A50T)的核心板

&#xff08;IEB-PS-3051-郵票孔&#xff09; 一、核心板概述 板卡基于JFMK50T4國產化FPGA芯片&#xff0c;設計的一款工業級核心板&#xff0c;板卡集成主芯片、電源、DDR、配置芯片&#xff0c;大大減輕客戶的擴展開發困難。豐富的IO和4個GTP&#xff0c;讓用戶輕…

Webpack 核心原理剖析

時至今日&#xff0c;Webpack 已迭代到 5.x 版本&#xff0c;其功能模塊的擴充和復雜度的提升使得源碼學習成本陡增。官方文檔的晦澀表述更是讓許多開發者望而卻步。然而&#xff0c;理解 Webpack 的核心原理對優化構建流程、定制化打包方案至關重要。本文將通過簡化流程和代碼…

移植Qt4.8.7到ARM40-A5

移植Qt4.8.7到ARM40-A5 主機平臺&#xff1a;Ubuntu 16.04 LTS(x64) 目標平臺&#xff1a;ARM40-A5 Qt版本&#xff1a;Qt4.8.7 ARM GCC編譯工具鏈&#xff1a; arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 ----------## Qt移植步驟 ## 1、了解Ubuntu&am…

C++_哈希

1. unordered系列關聯式容器在C98中&#xff0c;STL提供了底層為紅黑樹結構的一系列關聯式容器&#xff0c;在查詢時效率可達到$log_2 N$&#xff0c;即最差情況下需要比較紅黑樹的高度次&#xff0c;當樹中的節點非常多時&#xff0c;查詢效率也不理想。最好 的查詢是&#xf…

Redis 內存管理機制:深度解析與性能優化實踐

&#x1f9e0; Redis 內存管理機制&#xff1a;深度解析與性能優化實踐 文章目錄&#x1f9e0; Redis 內存管理機制&#xff1a;深度解析與性能優化實踐&#x1f9e0; 一、Redis 內存架構全景&#x1f4a1; Redis 內存組成結構&#x1f4ca; 內存占用分布示例?? 二、內存分配…

cargs: 一個輕量級跨平臺命令行參數解析庫

目錄 1.簡介 2.安裝與集成 3.項目的目錄結構及介紹 4.核心數據結構與函數 5.基本使用示例 6.應用案例和最佳實踐 7.高級用法 8.與其他庫的對比 9.總結 1.簡介 cargs 是一個輕量級、無依賴的 C 語言命令行參數解析庫&#xff0c;雖然本身是 C 庫&#xff0c;但可以無縫…

【數學建模】質量消光系數在煙幕遮蔽效能建模中的核心作用

前言&#xff1a;歡迎各位光臨本博客&#xff0c;這里小編帶你直接手撕質量相關系數&#xff0c;文章并不復雜&#xff0c;愿諸君耐其心性&#xff0c;忘卻雜塵&#xff0c;道有所長&#xff01;&#xff01;&#xff01;&#xff01; **&#x1f525;個人主頁&#xff1a;IF’…

Java代碼審計實戰:XML外部實體注入(XXE)深度解析

Java代碼審計實戰&#xff1a;XML外部實體注入&#xff08;XXE&#xff09;深度解析XML外部實體注入&#xff08;XXE&#xff09;是Web應用程序中一種常見但又常常被忽視的漏洞。它利用了XML解析器解析XML文檔時&#xff0c;允許引用外部實體這個特性。如果解析器沒有禁用外部實…

當服務器出現網卡故障時如何檢測網卡硬件故障并解決?

當服務器出現網卡故障時&#xff0c;可能導致網絡通信中斷&#xff0c;從而影響業務的正常運行。以下是檢測網卡硬件故障、診斷問題并解決的詳細方法和步驟。1. 網卡故障的常見表現1.1 硬件故障的常見癥狀網絡無法連接&#xff1a;服務器無法訪問外部網絡或用戶無法連接到服務器…

從車輛中心到用戶中心:E/E架構的變革與挑戰

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 做到欲望極簡,了解自己的真實欲望,不受外在潮流的影響,不盲從,不跟風。把自己的精力全部用在自己。一是去掉多余,凡事找規律,基礎是誠信;二是…

RPC內核細節(轉載)

RPC內核細節(轉載) 背景 隨著數據量、并發量、業務復雜度的增長&#xff0c;服務化是架構演進必由之路。服務化離不開RPC框架。 RPC服務化的好處 服務化的一個好處就是&#xff0c;不限定服務的提供方使用什么技術選型&#xff0c;能夠實現大公司跨團隊的技術解耦。 如下圖…