一、前言說明
和視頻監控onvif調試助手一樣,這次主要更新是針對收發數據打印的,之前是表格中顯示,每個數據包比較多的內容,如果要查找問題,經常要滾動條翻很久找對應數據,這次統一改成了表格的形式展示收發數據,有不同文字顏色顯示,如果需要查看詳細的數據,只需要雙擊對應行即可,節省了不少的調試時間,由於自己外接了很多的國標設備,數據量有時候蜂擁而至,還可以設置過濾條件過濾顯示需要的數據。
很奇怪的是,這個工具也主要是非開發人員使用,現在監控設備基本上都要求要支持國標gb28181,所以為了驗證設備是否正常,一般會先用個簡單的工具調試測試一下,尤其是兼容性,28181標準文檔對於有些規範描述不是很詳細,導致某些廠家實現就有出入,甚至有些都不符合規範,比如在點播視頻的時候,指定ssrc,而有些廠家做的設備居然沒有ssrc,這就需要服務端系統去兼容,我這個工具可以把每一條的收發數據打印,很容易查找分析出問題。
有個著名的國標系統wvp,非常多人用,BS架構網頁的,相當於可以直接公網使用,功能強大,缺點就是文件體積很大,部署很麻煩,調試很困難,而我這個綠色版雙擊可用,兼容任意系統,包括安卓和國產linux系統以及嵌入式板子,而wvp受限制比較多,搭建和調試需要專業的人員。
二、效果圖


三、相關地址
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_28181
四、功能特點
- 支持設備註冊、註銷、心跳、校時、註冊認證、註銷認證等。
- 設備上線後可以手動獲取設備狀態、設備信息、配置信息、預置位信息等。
- 設備上線後自動獲取設備通道信息,包括中文通道名稱。識別到通道上線離線變化,會重新獲取該設備的所有通道信息。
- 支持視頻點播,可以分別點播主碼流和子碼流,內置rtp解包線程,解包後發給視頻播放組件解碼播放。
- 每個設備每個通道支持點播多個視頻,通過ssrc區分,支持共用端口和不同端口收流。
- 支持對某個設備下面所有通道、某個通道、某個通道對應的某個流分別關閉。
- 支持錄像文件查詢和回放,回放控制支持暫停播放、繼續播放、倍速播放、切換播放進度。
- 支持錄像文件下載,支持倍速比如8倍速下載,可同時多線程批量下載。
- 回放和下載同時支持IPC和NVR,比如攝像頭自帶的SD存儲卡錄像文件回放,NVR上的硬盤錄像文件回放。
- 支持雲臺控制,向上、向下、向左、向右、左上、右上、左下、右下方位移動,鏡頭放大縮小,光圈放大縮小,鏡頭聚焦放焦。
- 支持預置位信息的查詢、調用、添加、修改、刪除等操作。
- 自動目錄訂閱功能,通道上線下線都有對應的信號通知。
- 內置定時讀取通道信息機制,以保證通道信息是最新的,比如有些NVR是不斷更新的通道信息。
- 內置訂閱警情和位置移動功能,訂閱後各種警情事件比如運動目標檢測報警、入侵檢測報警、徘徊檢測報警等自動上報。
- 支持語音對講功能,可以直接在視頻窗體的懸浮條上單擊語音對講按鈕,再次單擊關閉對講,對講期間懸浮條常駐顯示。
- 支持設備佈防撤防,佈防後警情信息會主動上報。
- 國標服務同時支持udp和tcp方式,可選只監聽一種或者兩種都監聽,tcp方式自動處理粘包問題。
- 國標拉流同時支持udp、tcp被動、tcp主動三種方式,每個通道都可以自由選擇何種拉流方式。
- 內置拉流端口池,每次拉流從中取出一個,關閉流自動回收端口號,重複利用。
- 收流端口自動糾錯,自動跳過被佔用的端口,不會出現端口占用導致收流失敗的情況。
- 支持三種取流方式自動檢測離線重連,檢測到離線後,自動重啟點播拉流整個流程。
- 錄像文件回放,上一個完成後自動切換到下一個繼續回放,直到所有回放完成。支持高達8倍速回放。
- 視頻播放自適應硬解碼,極低資源佔用,實時性極好,帶懸浮條顯示視頻流信息,可以直接在懸浮條單擊按鈕保存錄像文件到本地。
- 支持幾千路國標消息交互併發,實時視頻流支持64路同時顯示,可以拓展更多路數。
- 支持阿里雲等雲服務器,可以分別設置內網監聽地址和外網訪問地址,一般雲服務器上是監聽地址用內網,對外訪問用外網地址。
- 支持視頻分發,也就是推流,視頻通道打開後可以自動推流到流媒體服務器,其他需要的地方拉流即可,支持rtsp、rtmp、hls、webrtc等方式拉流。
- 視頻分發也叫推流分發,表格方式展示正在推流的信息,其中包括顯示統計哪些流正在被多少個地址拉取,比如有兩個地方通過rtsp打開了取流,則對應推流地址行所在rtsp列顯示數量2,非常直觀的展示有多少個拉流。
- 視頻分發支持無人觀看超時自動關閉推流和點播,提高帶寬的利用率,沒人觀看太久的時候,沒必要點播拉流和推流。在後臺服務模式下,通道推流自動複用,當該通道已經存在點播推流,則複用該路流數據,不會再去點播,節約資源。
- 提供後臺服務功能,定義了一套私有協議,根據私有協議進行交互,支持tcp、http、mqtt等方式交互,方便第三方程序接入集成。通信協議非常完整,支持獲取設備列表、獲取指定通道視頻地址、雲臺控制、預置位操作、錄像查詢、錄像回放、錄像下載、回放倍速等控制、警情消息通知、視頻點播和關閉等。
- 支持註冊重定向,方便做負載均衡和區域化部署,這樣可以支持幾十萬個設備連接都沒問題。
- 支持圖像抓拍,可以設置抓拍最多10張圖片,可設置抓拍間隔,抓拍到的圖片會通過信號通知。
- 實時預覽和錄像回放都支持推流,推流支持疊加文字和圖片水印以及各種ffmpeg支持的濾鏡效果,支持多個水印同時疊加。
- 支持各種國標平臺上級域級聯,比如easygbs、livegbs、海康大華國標平臺,上級域級聯到本軟件,自動解析資源目錄等。
- 可開啟共享設備,默認開啟,以便udp方式處理sip交互的同時,tcp方式接收平臺推送的資源目錄和錄像文件信息。
- 極速響應設備上線,無需過多等待,只要有過一條消息,無論是收到註冊指令、心跳指令、推送指令等,都能立即獲取或者解析設備信息和通道信息並上線。
- 同時支持gb28181-2011、gb28181-2016、gb28181-2022以及後續可能的所有協議版本。
- SIP解析和交互採用純Qt底層代碼實現,udp/tcp通信交互,祖傳原創代碼解析,不依賴任何第三方。
- 代碼量少,gb28181交互部分共幾千行代碼,註釋詳細,接口友好,使用極其簡單,提供非常詳細的使用示例。
- 支持海康、大華、宇視、華為、天地偉業等所有國標設備,包括一些沒有ssrc的設備。
- 支持所有Qt版本和編譯器以及操作系統,包括但不限於win、linux、mac、android、嵌入式linux、樹莓派香橙派、國產os等。
五、相關代碼
2.0 基本步驟
- 第一步,將core_gb28181server和core_gb28181rtp以及core_gb28181widget目錄拷貝到你的項目的上一級目錄。
- 第二步,打開項目的pro文件,引入gb28181組件,include ($$PWD/../core_gb28181server/core_gb28181server.pri) 和 include ($$PWD/../core_gb28181rtp/core_gb28181rtp.pri)以及include ($$PWD/../core_gb28181widget/core_gb28181widget.pri) 。
- 第三步,在代碼文件引入對應頭文件,#include "gb28181server.h",使用代碼。
- core_gb28181server負責信令解析和交互,core_gb28181rtp負責rtp解包,core_gb28181widget負責視頻顯示,解碼默認使用core_videomdk組件,此組件使用ffmpeg開發。也可以切換成core_videoffmpeg組件。
- 為了使用方便,特意封裝了GB28181Widget類,專用於國標流的預覽、回放、下載,不顯示期間不會觸發繪製,不用擔心佔用系統資源,此類也可用於推流。
2.1 啟動服務
//實例化國標服務類
GB28181Server *server = new GB28181Server;
//設置需要的參數
GB28181ServerPara para;
//國標編碼
para.serverId = "34020000002000000001";
//區域編碼
para.serverRealm = "3402000000";
//外網地址/設備端填寫的服務器地址就是這個地址/如果是本地則和監聽地址相同
para.serverHost = "192.168.0.110";
//監聽地址
para.serverIp = "192.168.0.110";
//監聽端口
para.serverPort = 15060;
//認證密碼/為空的話則不啟用認證
para.serverPwd = "12345678";
//查詢通道信息的間隔/0表示不啟用/單位秒
para.queryInterval = 0;
server->setServerPara(para);
//啟動服務/udp和tcp同時監聽
server->start(ListenMode_Both);
//綁定信號接收數據
//設備上下線
connect(server, SIGNAL(deviceChanged(QString, bool)), this, SLOT(deviceChanged(QString, bool)));
//通道變化
connect(server, SIGNAL(channelChanged(QString, QList<GB28181Channel>)), this, SLOT(channelChanged(QString, QList<GB28181Channel>)));
//警情上報
connect(server, SIGNAL(receiveEvent(GB28181Event)), this, SLOT(receiveEvent(GB28181Event)));
//媒體狀態變化
connect(server, SIGNAL(receiveStatus(GB28181Status)), this, SLOT(receiveStatus(GB28181Status)));
//返回預置位信息
connect(server, SIGNAL(receivePreset(QList<GB28181Preset>)), this, SLOT(receivePreset(QList<GB28181Preset>)));
//返回錄像文件信息
connect(server, SIGNAL(receiveRecord(QList<GB28181Record>)), this, SLOT(receiveRecord(QList<GB28181Record>)));
//停止服務
server->stop();