天天看點

Qt編寫視訊監控系統76-Onvif跨網段多點傳播搜尋和單點傳播搜尋的實作

作者:Qt自定義控件

一、前言

在視訊監控行業一般會用國際onvif工具來測試裝置是否支援onvif協定,工具的名字叫ONVIF Device Manager(還有個工具叫ONVIF Device Test Tool,專用于程式員測試各種資料互動),可以自行搜尋下載下傳,此工具位國際官方工具,如果此工具搜尋不到錄影機,則說明該錄影機不是真正的onvif錄影機,不是标準的錄影機,目前市面上的絕大部分網絡錄影機都支援onvif。具體用法可以參考 https://www.cnblogs.com/lsdb/p/9157302.html。

官方的onvif工具盡管使用者數巨大,但是也存在不少缺點,比如不能選擇對應網卡搜尋,而且在某些時候鑒權會失敗,年久失修,幾乎快十年都沒有更新了,是以特意用Qt底層代碼協定實作onvif的相關功能,非gsoap的代碼,采用原創的udp多點傳播和http請求進行處理,通過抓包來相容各個廠家各種不同版本的協定。

Onvif元件功能設計:

  • 搜尋裝置,擷取裝置的資訊比如廠家、型号等。
  • 可指定網卡搜尋,可能有多個網卡多個網段位址。
  • 可手動指定單個裝置位址搜尋,用于多點傳播搜尋不通但是網絡通的情況。
  • 可以選擇累加的方式統計搜尋到的裝置,在跨網段大量裝置的情況下尤其需要。
  • 擷取裝置的多個配置檔案資訊profile。
  • 擷取對應配置檔案的視訊流位址rtsp,以及分辨率等參數。
  • 雲台控制,上下左右移動,焦距放大縮小,相對和絕對移動。
  • 擷取預置位資訊,增删改查,觸發預置位。
  • 訂閱事件,接收裝置的各種消息尤其是報警事件比如IO口的報警。
  • 抓圖,擷取裝置目前的圖檔。
  • 擷取和裝置網絡配置資訊比如IP位址等。
  • 擷取和設定NTP時間同步以及設定裝置時間。
  • 擷取和設定視訊參數和圖檔參數(亮度、色彩、飽和度)。
  • 重新開機裝置。
  • 增加、删除、修改、查詢OSD資訊。

二、效果圖

三、體驗位址

  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_system。

四、相關代碼

bool OnvifSearch::search(const QString &localIP, const QString &deviceIP)
{
    if (timerSearch->isActive()) {
        timerSearch->stop();
    }

    deviceCount = 0;
    ips.clear();
    buffers.clear();

    deviceInfos.clear();
    if (!OnvifHelper::isIP(localIP)) {
        return false;
    }

    //如果改變了IP位址則重新綁定,還未成功則先綁定
    if (currentIP != localIP) {
        isOk = false;
    }

    if (!isOk) {
        currentIP = localIP;
        udpSocket->abort();
        isOk = udpSocket->bind(QHostAddress(localIP), 0, QUdpSocket::ShareAddress);
        //udpSocket->joinMulticastGroup(QHostAddress("239.255.255.250"));
    }

    if (!isOk) {
        emit receiveError(QString("綁定多點傳播 -> 失敗: %1").arg(udpSocket->errorString()));
        return false;
    }

    //單點傳播搜尋對指定的位址發送搜尋指令
    if (!deviceIP.isEmpty()) {
        //判斷是否是IP還是位址(http開頭表示指定onvif位址進行搜尋)
        //http://192.168.1.128/onvif/device_service
        if (deviceIP.startsWith("http")) {
            QString ip = OnvifHelper::getUrlIP(deviceIP);
            QStringList list = deviceIP.split("/");
            if (list.count() < 3) {
                emit receiveError(QString("位址錯誤 -> %1").arg(deviceIP));
                return false;
            }

            int port = 80;
            QString info = list.at(2);
            if (info.contains(":")) {
                port = info.split(":").last().toInt();
            }

            //先判斷位址是否通
            if (!OnvifHelper::ipLive(ip, port)) {
                emit receiveError(QString("位址不通 -> %1").arg(deviceIP));
                return false;
            }

            //建構一個裝置
            OnvifDeviceInfo deviceInfo;
            deviceInfo.onvifAddr = deviceIP;
            deviceInfo.deviceIp = ip;
            deviceInfos << deviceInfo;
            emit receiveDevice(deviceInfo);
            emit receiveInfo(QString("發現裝置 -> %1").arg(deviceIP));
        } else {
            currentFile = ":/onvifsend/SearchDevice2.xml";
            writeData(deviceIP);
        }
    } else {
        //間隔小于0.1s則認為隻需要發送一次資料
        if (searchInterval >= 100) {
            currentFile = ":/onvifsend/SearchDevice1.xml";
            timerSearch->start();
        } else {
            //searchInterval=2 則發送 SearchDevice2.xml
            currentFile = QString(":/onvifsend/SearchDevice%1.xml").arg(searchInterval);
        }

        //之前是直接全部放在這裡發送,發現部分裝置要好幾次才能回來
        //改成定時器排隊發送多種廣播搜尋資料,就沒有問題
        sendData();
    }

    return true;
}           

五、功能特點

5.1 軟體子產品

  1. 視訊監控子產品,各種停靠小窗體子子產品,包括裝置清單、圖文警情、視窗資訊、雲台控制、預置位、巡航設定、裝置控制、懸浮地圖、網頁浏覽等。
  2. 視訊回放子產品,包括本地回放、遠端回放、裝置播放、圖檔回放、視訊上傳等。
  3. 電子地圖子產品,包括圖檔地圖、線上地圖、離線地圖、路徑規劃等。
  4. 日志查詢子產品,包括本地日志、裝置日志等。
  5. 系統設定子產品,包括系統設定(基本設定、視訊參數、資料庫設定、地圖配置、序列槽配置等)、錄像機管理、錄影機管理、輪詢配置、錄像計劃、使用者管理等。

5.2 基礎功能

  1. 支援各種視訊流(rtsp、rtmp、http等)、視訊檔案(mp4、rmvb、avi等)、本地USB錄影機播放。
  2. 支援多畫面切換,包括1、4、6、8、9、13、16、25、36、64畫面切換。
  3. 支援全屏切換,多種切換方式包括滑鼠右鍵菜單、工具欄按鈕、快捷鍵(alt+enter全屏,esc退出全屏)。
  4. 支援視訊輪詢,包括1、4、9、16畫面輪詢,可設定輪詢分組(輪詢預案)、輪詢間隔、碼流類型等。
  5. 支援onvif協定,包括裝置搜尋、雲台控制、預置位、裝置控制(圖檔參數、校對時間、系統重新開機,抓拍圖檔等)。
  6. 支援權限管理,不同的使用者可以對應不同的子產品權限,比如删除日志、關閉系統等。
  7. 資料庫支援多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。
  8. 本地USB錄影機支援設定分辨率、幀率等參數。
  9. 所有停靠子產品都自動生成對應的菜單用來控制顯示和隐藏,在标題欄右鍵可以彈出。
  10. 支援顯示所有子產品、隐藏所有子產品、複位普通布局、複位全屏布局。
  11. 輕按兩下裝置彈出實時預覽視訊,支援圖檔地圖、線上地圖、離線地圖等。
  12. 錄影機節點拖曳到對應窗體播放視訊,同時支援拖曳本地檔案直接播放。
  13. 删除視訊支援滑鼠右鍵删除、懸浮條關閉删除、拖曳到視訊監控面闆外删除等多種方式。
  14. 圖檔地圖上裝置按鈕可自由拖動,自動儲存位置資訊。百度地圖上可以滑鼠單擊擷取經緯度資訊,用來更新裝置位置。
  15. 視訊監控面闆窗體中任意通道支援拖曳交換,瞬間響應。
  16. 封裝了百度地圖,視圖切換,運動軌迹,裝置點位,滑鼠按下擷取經緯度等。
  17. 輕按兩下節點、拖曳節點、拖曳窗體交換位置等操作,均自動更新儲存最後的播放位址,下次軟體打開自動應用。
  18. 右下角音量條控件,失去焦點自動隐藏,音量條帶靜音圖示。
  19. 支援視訊截圖,可指定單個或者對所有通道截圖,底部小工具欄也有截圖按鈕。
  20. 支援逾時自動隐藏滑鼠指針、自動全屏機制。
  21. 支援onvif雲台控制,可上下左右移動雲台錄影機,包括複位和焦距調整等。
  22. 支援onvif預置位,可以添加、删除、修改預置位,可以調用起始位。
  23. 支援onvif圖像參數設定,包括明亮度、對比度、飽和度、尖銳度等。
  24. 支援onvif其他操作,包括抓圖、網絡設定、校時、重新開機、事件訂閱等。
  25. 支援任意onvif錄影機,包括但不限于海康、大華、宇視、天地偉業、華為等。
  26. 可儲存視訊,可標明時存儲或者單檔案存儲,可選存儲間隔時間。
  27. 可設定視訊流通信方式tcp+udp,可設定視訊解碼是速度優先、品質優先、均衡等。
  28. 可設定軟體中文名稱、英文名稱、LOGO圖示等。
  29. 存儲的視訊檔案支援導出到指定目錄,支援批量上傳到伺服器。
  30. 完善的錄像計劃設定,支援每個通道7 * 24小時每半小時設定是否存儲錄像。

5.3 特色功能

  1. 主界面采用停靠窗體模式,各種元件以小子產品的形式加入,可自定義任意子產品加入。
  2. 停靠子產品可拖動任意位置嵌入和懸浮,支援最大化全屏,支援多螢幕。
  3. 雙重布局檔案存儲機制,正常模式、全屏模式都對應不同的布局方案,自動切換和儲存,比如全屏模式可以突出幾個子產品透明顯示在指定位置,更具科幻感現代化。
  4. 原創onvif協定機制,采用底層協定解析(udp廣播搜尋+http請求執行指令)更輕量易懂易學習拓展,不依賴任何第三方元件比如gsoap。
  5. 原創資料導入、導出、列印機制,跨平台不依賴任何元件,瞬間導出資料。
  6. 内置多個原創元件,宇宙超值超級牛逼,包括資料導入導出元件(導出到xls、pdf、列印)、資料庫元件(資料庫管理線程、自動清理資料線程、萬能分頁、資料請求等)、地圖元件、視訊監控元件、檔案多線程收發元件、onvif通信元件、通用浏覽器核心元件等。
  7. 自定義資訊框+錯誤框+詢問框+右下角提示框(包含多種格式)等。
  8. 精美換膚,高達17套皮膚樣式随意更換,所有樣式全部統一,包括菜單等。
  9. 視訊控件懸浮條可以自行增加多個按鈕,監控界面底部小工具欄也可自行增加按鈕。
  10. 輕按兩下錄影機節點自動播放視訊,輕按兩下節點自動依次添加視訊,會自動跳到下一個,輕按兩下父節點自動添加該節點下的所有視訊。可選主碼流、子碼流。
  11. 錄像機管理、錄影機管理,可添加删除修改導入導出列印資訊,立即應用新的裝置資訊生成樹狀清單,不需重新開機。
  12. 可選多種核心自由切換,ffmpeg、vlc、mpv等,均可在pro中設定。推薦用ffmpeg,跨平台最多,預設提供好了linux和mac平台上編譯好的庫。
  13. 支援硬解碼,可設定硬解碼類型(qsv、dxva2、d3d11va等)。
  14. 預設采用opengl繪制視訊,超低的CPU資源占用,支援yuyv和nv12兩種格式繪制,性能爆表。
  15. 标簽和圖形資訊支援三種繪制方式,繪制到遮罩層、繪制到圖檔、源頭繪制(對應資訊可以存儲到檔案)。
  16. 高度可定制化,使用者可以很友善的在此基礎上衍生自己的功能,比如增加自定義子產品,增加運作模式、機器人監控、無人機監控、挖掘機監控等。
  17. 支援xp、win7、win10、win11、linux、mac、各種國産系統(UOS、中标麒麟、銀河麒麟等)、嵌入式linux等系統。
  18. 注釋完整,項目結構清晰,超級詳細完整的使用開發手冊,精确到每個代碼檔案的功能說明,不斷持續疊代版本。

繼續閱讀