一、功能特點
- 廣播搜索設備,支持IPC和NVR,依次返回。
- 可選擇不同的網卡IP進行對應網段設備的搜索。
- 依次獲取Onvif地址、Media地址、Profile文件、Rtsp地址。
- 可對指定的Profile獲取視頻流Rtsp地址,比如主碼流地址、子碼流地址。
- 可對每個設備設置Onvif用戶信息,用於認證獲取詳細信息。
- 可實時預覽攝像機圖像。
- 支持雲臺控制,可上下左右調節雲臺,支持絕對移動、相對移動、連續移動三種方式,可對圖像拉近拉遠。
- 支持獲取預置位集合、調用預置位、添加預置位、刪除預置位等。
- 支持圖片參數設置,包括亮度、對比度、飽和度、銳度等。
- 支持Qt4和Qt6任意Qt版本以及後續Qt版本,親測Qt4.7到Qt6.5。
- 支持任意編譯器,親測mingw、msvc、gcc、clang。
- 支持任意操作系統,親測xp、win7、win10、android、linux、嵌入式linux、樹莓派全志H3等。
- 支持任意Onvif攝像機和NVR,親測海康、大華、宇視、天地偉業、華爲、海思芯片內核等,可定製開發。
- 支持對指定IP地址及onvif地址進行單播搜索,比如跨網段情況下非常有用。
- 支持指定過濾條件過濾搜索設備,比如只搜索某個網段的設備或者針對某個地址的設備。
- 支持搜索間隔和搜索策略設置,保證所有設備搜索回來,在大量設備現場很有用(親測上千個攝像機現場,搜索回來的設備數量比攝像機廠家自帶搜索工具還要準確)。
- 可對設備進行重啓、網絡參數獲取等。
- 支持各種事件訂閱(入侵報警、越界報警、遮擋報警等)、Onvif抓圖等操作。
- 支持NTP校時和時間同步設置。
- 支持OSD相關操作,可以增刪改查OSD信息。
- 內置了線程實時執行Onvif指令隊列,排隊最大速度的執行對應的指令,執行結果信號發出。
- 採用的最底層的TCP+UDP通信機制,原創最底層協議解析,純QtWidget編寫。
- 超級小巧輕量,總共約3000行代碼,不依賴任何第三方的庫和組件,跨平臺。
- 封裝好了通用的數據發送和接收解析的函數,可以非常方便的自行拓展其他Onvif處理。
- 工具上提供了收發數據文本框,顯示收發的數據,方便查看和分析。
- 支持所有Onvif設備,代碼工整,接口友好,直接引入pri即可使用。
二、主要功能
- 搜索設備,獲取設備的信息比如廠家、型號等。
- 獲取設備的多個配置文件信息profile。
- 獲取對應配置文件的視頻流地址rtsp,以及分辨率等參數。
- 雲臺控制,上下左右移動,焦距放大縮小,相對和絕對移動。
- 獲取預置位信息,觸發預置位。
- 訂閱事件,接收設備的各種消息尤其是報警事件比如IO口的報警。
- 抓圖,獲取設備當前的圖片。
- 獲取、創建、刪除用戶信息。
- 獲取和設備網絡配置信息比如IP地址等。
- 獲取和設置NTP時間同步以及設置設備時間。
- 獲取和設置視頻參數和圖片參數(亮度、色彩、飽和度)。
- 重啓設備。
三、雲臺說明
- x、y、z 範圍都在0-1之間。
- x爲負數,表示左轉,x爲正數,表示右轉。
- y爲負數,表示下轉,y爲正數,表示上轉。
- z爲正數,表示拉近,z爲負數,表示拉遠。
- 通過x和y的組合,來實現雲臺的控制。
- 通過z的組合,來實現焦距控制。
四、處理流程
- 綁定組播IP(239.255.255.250)和端口(3702),發送固定的xml格式的數據搜索設備。
- 接收到的xml格式的數據解析,得到設備的Onvif地址。
- 對Onvif地址發送對應的數據,收到數據取出對應的節點數據。
- 請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的配置文件,Ptz地址用來雲臺控制。
- ptz控制是對Ptz地址發送對應的數據即可。
- 設置了用戶認證的需要組織用戶token信息一塊發送,每次都需要作鑑權處理。
- 接收到的數據不是標準的xml數據,帶有前綴命名空間,解析的時候要注意。
- 每個廠家設備返回的數據未必完全一致,基本上都不一致,需要進行模糊查找節點值。
- 特意採用底層協議解析,因爲soap太臃腫函數名稱太另類,特意做的輕量級的。
- 兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool。
五、使用說明
- 必須確認攝像機是支持onvif的攝像機。
- 搜索的時候選定正確的網卡,建議同一網段。
- 攝像機必須開啓了onvif服務,很多攝像機爲了安全性考慮默認可能不開啓。
- onvif用戶信息必須正確,一般攝像機onvif功能開啓的地方可以添加用戶。
- 在界面上輸入用戶名和密碼的時候記得在界面中輸入,不要在配置文件中輸入,配置文件中存儲的是密文。
- 圖片參數的範圍值有多種:0-100 0-128 0-255 如果發現設置不成功可以把值調小一點試試。
- 可以用國際官方工具(Onvif Device Manager 和 Onvif Device Test Tool)進行測試對比。
- 國際工具下載地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf
六、代碼使用
- 第一步:拷貝onvif組件源碼到你的項目,放到同級目錄。
- 第二步:在項目pro文件中引入組件 include ($$PWD/../core_onvif/core_onvif.pri)。
- 第三步:代碼文件引入頭文件 #include "onvifsearch.h" #include "onvifdevice.h",其中onvifsearch用於搜索設備,onvifdevice用於獲取設備的詳細信息比如rtsp視頻流地址。
- 第四步:組播或者單播搜索設備,獲取到對應的onvif地址。每個設備都有一個唯一的onvif地址。
//實例化搜索對象並關聯信號槽
OnvifSearch *search = new OnvifSearch(this);
connect(search, SIGNAL(receiveDevice(OnvifDeviceInfo)), this, SLOT(receiveDevice(OnvifDeviceInfo)));
//參數1是網卡地址/參數2指定地址則表示單播
search->search("192.168.0.110", "");
void frmSimple::receiveDevice(const OnvifDeviceInfo &deviceInfo)
{
QString msg = QString("收到設備: %1").arg(deviceInfo.onvifAddr);
ui->textEdit->append(msg);
QListWidgetItem *item = new QListWidgetItem;
item->setText(deviceInfo.deviceIp);
item->setData(Qt::UserRole, deviceInfo.onvifAddr);
ui->listWidget->addItem(item);
}
- 第五步:對指定的onvif地址發送http請求,獲取詳細信息。
//實例化onvif對象實例
OnvifDevice *device = new OnvifDevice(this);
//設置用戶信息用於請求的時候認證用
device->setUserInfo("admin", "123456");
//設置請求地址
device->setOnvifAddr("http://192.168.0.64/onvif/device_service");
//先獲取服務文件
device->getServices();
//可能爲空需要按照另一種方式獲取
if (device->getMediaUrl().isEmpty()) {
device->getCapabilities();
}
//獲取配置文件
QList<OnvifProfileInfo> profiles = device->getProfiles();
foreach (OnvifProfileInfo profile, profiles) {
ui->cboxProfiles->addItem(profile.token);
}
//對指定的配置文件獲取視頻地址
QString token = ui->cboxProfiles->currentText();
QString url = device->getStreamUri(token);
ui->txtStreamUri->setText(url);
七、體驗地址
- 體驗地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 名稱:bin_video_onvif/bin_linux_video
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 視頻主頁:https://space.bilibili.com/687803542/
八、效果圖