dplayer js控制 自動全屏_Qt編寫安防視頻監控系統18-云臺控制

92e964558af290b40e0e7cdcc19d135c.gif

一、前言

云臺控制是視頻監控系統中必備的一個功能,對球機進行上下左右的移動,還有焦距的控制,其實核心就是控制XYZ三個坐標軸,為了開發這個模塊,特意研究了各種云臺控制的方法和開源庫比如soap,有些廠家使用自家SDK控制云臺,但是大部分都會選擇onvif來控制,畢竟是國際標準的通用的,只要符合這個標準的都可以使用,onvif協議的解析通常用的開源庫是soap,涵蓋的內容比較全,包括獲取各種設備信息和回控等,缺點就是比較臃腫,使用非常不容易,函數名實在是有點不順手,很多新手都繞在其中不知所措最后放棄,其實onvif官方提供的就是soap,可能要照顧到所有的onvif標準吧,內容特別多,我看過其中的部分源碼,底層機制和我最終自創的解析機制完全一致,為此特意將純Qt網絡通信封裝了一個onvif通信類做成的pri模塊,大致的處理流程如下:

onvif處理流程

1. 綁定組播IP(239.255.255.250)和端口(3702),發送固定的xml格式的數據搜索設備。 2. 接收到的xml格式的數據解析,得到設備的Onvif地址。 3. 對Onvif地址發送對應的數據,收到數據取出對應的節點數據。 4. 請求Onvif地址獲取Media地址和Ptz地址,Media地址用來獲取詳細的配置文件,Ptz地址用來云臺控制。 5. ptz控制是對Ptz地址發送對應的數據即可。 6. 設置了用戶認證的需要組織用戶token信息一塊發送,每次都需要作鑒權處理。 7. 接收到的數據不是標準的xml數據,沒法按照正常的節點解析來處理,只能用QXmlQuery來做。 8. 每個廠家設備返回的數據未必完全一致,基本上都不一致,需要進行模糊查找節點值。 9. 特意采用底層協議解析,因為soap太臃腫函數名稱太另類,特意做的輕量級的。 10. 兩個必備工具,Onvif Device Manager 和 Onvif Device Test Tool。

ptz云臺說明

1. x、y、z 范圍都在0-1之間。 2. x為負數,表示左轉,x為正數,表示右轉。 3. y為負數,表示下轉,y為正數,表示上轉。 4. z為正數,表示拉近,z為負數,表示拉遠。 5. 通過x和y的組合,來實現云臺的控制。 6. 通過z的組合,來實現焦距控制。

onvif功能模塊特點

1. 廣播搜索設備,支持IPC和NVR,依次返回,可選擇不同的網卡IP。 2. 依次獲取Onvif地址、Media地址、Profile文件、Rtsp地址。 3. 可對指定的Profile獲取視頻流Rtsp地址,比如主碼流子碼流地址。 4. 可對每個設備設置Onvif用戶信息,用于認證獲取詳細信息。 5. 可實時預覽攝像機圖像。 6. 支持云臺控制,可上下左右調節云臺,支持絕對移動和相對移動,可放到和縮小圖像遠近。 7. 支持Qt4和Qt5任意Qt版本,親測Qt4.7.0到Qt5.12.4。 8. 支持任意編譯器,親測mingw、msvc、gcc、clang。 9. 支持任意操作系統,親測xp、win7、win10、linux、嵌入式linux、樹莓派全志H3等。 10. 支持任意Onvif攝像機和NVR,親測海康、大華、宇視、華為、海思芯片內核等,可定制開發。 11. 支持對指定IP地址進行單播搜索,比如跨網段情況下非常有用。 12. 純Qt編寫,超級小巧輕量,總共約2000行代碼,不依賴任何第三方的庫和組件,跨平臺。 13. 封裝好了通用的數據發送和接收解析的函數,可以非常方便的自行拓展其他Onvif處理比如修改IP等。 14. 工具上提供了收發數據文本框,顯示收發的數據,方便查看和分析。 15. 支持所有Onvif設備,代碼工整,接口友好,直接引入pri即可使用。

通用視頻控件開源地址:https://gitee.com/feiyangqingyun/QWidgetDemo https://github.com/feiyangqingyun/QWidgetDemo 文件名稱:videowidget

體驗地址:https://gitee.com/feiyangqingyun/QWidgetExe https://github.com/feiyangqingyun/QWidgetExe 文件名稱:bin_video_system.zip

二、功能特點

  1. 支持16畫面切換,全屏切換等,包括1+4+6+8+9+13+16畫面切換。
  2. 支持alt+enter全屏,esc退出全屏。
  3. 自定義信息框+錯誤框+詢問框+右下角提示框。
  4. 17套皮膚樣式隨意更換,所有樣式全部統一,包括菜單等。
  5. 云臺儀表盤鼠標移上去高亮,八個方位精準識別。
  6. 底部畫面工具欄(畫面分割切換+截圖聲音等設置)移上去高亮。
  7. 可在配置文件更改左上角logo+中文軟件名稱+英文軟件名稱。
  8. 封裝了百度地圖,三維切換,設備點位,鼠標按下獲取經緯度等。
  9. 堆棧窗體,每個窗體都是個單獨的qwidget,方便編寫自己的代碼。
  10. 頂部鼠標右鍵菜單,可動態控制時間CPU+左上角面板+左下角面板+右上角面板+右下角面板的顯示和隱藏,支持恢復默認布局。
  11. 工具欄可以放置多個小圖標和關閉圖標。
  12. 左側右側可拖動拉伸,并自動記憶寬高位置,重啟后恢復。
  13. 雙擊攝像機節點自動播放視頻,雙擊節點自動依次添加視頻,會自動跳到下一個,雙擊父節點自動添加該節點下的所有視頻。
  14. 攝像機節點拖曳到對應窗體播放視頻,同時支持拖曳本地文件直接播放。
  15. 視頻畫面窗體支持拖曳交換,瞬間響應。
  16. 雙擊節點+拖曳節點+拖曳窗體交換位置,均自動更新url.txt。
  17. 支持從url.txt中加載16通道視頻播放,自動記憶最后通道對應的視頻,軟件啟動后自動打開播放。
  18. 右下角音量條控件,失去焦點自動隱藏,音量條帶靜音圖標。
  19. 集成百度地圖,可以添加設備對應位置,自動生成地圖,支持縮放和三維地圖,提供地圖風格選擇,共12種風格。
  20. 視頻拖動到通道窗體外自動刪除視頻。
  21. 鼠標右鍵可刪除當前+所有視頻,截圖當前+所有視頻。
  22. 錄像機管理、攝像機管理,可添加刪除修改導入導出打印信息,立即應用新的設備信息生成樹狀列表,不需重啟。
  23. 在pro文件中可以自由開啟是否加載地圖。
  24. 視頻播放可選四種內核自由切換,vlc+ffmpeg+easyplayer+海康sdk,均可在pro中設置。
  25. 可設置1+4+9+16畫面輪詢,可設置輪詢間隔以及輪詢碼流類型等,直接在主界面底部工具欄右側單擊啟動輪詢按鈕即可,再次單擊停止輪詢。
  26. 默認超過10秒鐘未操作自動隱藏鼠標指針。
  27. 支持onvif搜素設備,支持任意onvif攝像機,包括但不限于海康大華宇視天地偉業華為等,支持onvif云臺控制。
  28. 高度可定制化,用戶可以很方便的在此基礎上衍生自己的功能,支持linux系統。

三、效果圖

01a615e8e607e9c31511556d8a7d1f32.gif

951296307d694ffd53c6dfffb1654bac.png

四、核心代碼

OnvifDevice *frmVideoMain::getCurrentDevice()
{OnvifDevice *onvifDevice = 0;//判斷當前url,找出該url對應的ptz地址if (!App::CurrentUrl.isEmpty()) {//可能是主碼流也可能是子碼流int index1 = DBData::IpcInfo_RtspMain.indexOf(App::CurrentUrl);int index2 = DBData::IpcInfo_RtspSub.indexOf(App::CurrentUrl);int index = -1;if (index1 >= 0) {index = index1;} else if (index2 >= 0) {index = index2;}if (index >= 0) {QString userName = DBData::IpcInfo_UserName.at(index);QString userPwd = DBData::IpcInfo_UserPwd.at(index);QString onvifAddr = DBData::IpcInfo_OnvifAddr.at(index);QString mediaAddr = DBData::IpcInfo_MediaAddr.at(index);QString ptzAddr = DBData::IpcInfo_PtzAddr.at(index);bool exist = false;foreach (OnvifDevice *device, devices) {if (device->getDeviceUrl() == onvifAddr) {exist = true;onvifDevice = device;break;;}}if (!exist) {onvifDevice = new OnvifDevice(this);}onvifDevice->setUser(userName, userPwd);onvifDevice->setDeviceUrl(onvifAddr);onvifDevice->setMediaUrl(mediaAddr);onvifDevice->setPtzUrl(ptzAddr);if (!exist) {devices << onvifDevice;}}}return onvifDevice;
}void frmVideoMain::moveRelative(double x, double y, double z)
{OnvifDevice *device = getCurrentDevice();if (device != 0) {QString profileToken = device->getProfile();device->moveRelative(profileToken, x, y, z);qDebug() << "相對移動" << App::CurrentUrl << profileToken;}
}void frmVideoMain::moveAbsolute(double x, double y, double z)
{OnvifDevice *device = getCurrentDevice();if (device != 0) {QString profileToken = device->getProfile();device->moveAbsolute(profileToken, x, y, z);qDebug() << "絕對移動" << App::CurrentUrl << profileToken;}
}void frmVideoMain::mousePressed(int position)
{QString str;if (position == 0) {str = "底部";} else if (position == 1) {str = "左下角";} else if (position == 2) {str = "左側";} else if (position == 3) {str = "左上角";} else if (position == 4) {str = "頂部";} else if (position == 5) {str = "右上角";} else if (position == 6) {str = "右側";} else if (position == 7) {str = "右下角";} else if (position == 8) {str = "中間";}DeviceHelper::addMsg(QString("按下云臺 %1").arg(str));
}void frmVideoMain::mouseReleased(int position)
{QString str;if (position == 0) {str = "底部";} else if (position == 1) {str = "左下角";} else if (position == 2) {str = "左側";} else if (position == 3) {str = "左上角";} else if (position == 4) {str = "頂部";} else if (position == 5) {str = "右上角";} else if (position == 6) {str = "右側";} else if (position == 7) {str = "右下角";} else if (position == 8) {str = "中間";}DeviceHelper::addMsg(QString("松開云臺 %1").arg(str));mousePtz(position);
}void frmVideoMain::mousePtz(int position)
{//根據按下的不同部位發送云臺控制命令//1. x、y、z 范圍都在0-1之間。//2. x為負數,表示左轉,x為正數,表示右轉。//3. y為負數,表示下轉,y為正數,表示上轉。//4. z為正數,表示拉近,z為負數,表示拉遠。//5. 通過x和y的組合,來實現云臺的控制。//6. 通過z的組合,來實現焦距控制。//計算速度,轉為小數double speed = (double)ui->sliderPtzSpeed->value() / 10;if (position == 0) {moveRelative(0.0, -speed, 0.0);} else if (position == 1) {moveRelative(-speed, -speed, 0.0);} else if (position == 2) {moveRelative(-speed, 0.0, 0.0);} else if (position == 3) {moveRelative(-speed, speed, 0.0);} else if (position == 4) {moveRelative(0.0, speed, 0.0);} else if (position == 5) {moveRelative(speed, speed, 0.0);} else if (position == 6) {moveRelative(speed, 0.0, 0.0);} else if (position == 7) {moveRelative(speed, -speed, 0.0);} else if (position == 8) {moveAbsolute(0.0, 0.0, 0.0);}
}

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

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

相關文章

css不換行屬性_那些不常見,但卻非常實用的css屬性(整理不易)

1、-webkit-line-clamp可以把 塊容器 中的內容限制為指定的行數。并且在超過行數后&#xff0c;在最后一行顯示"..."這是正常的展示display: -webkit-box; /*值必須為-webkit-box或者-webkit-inline-box*/ -webkit-box-orient: vertical; /*值必須為vertical*/ -webk…

計算機總是無法響應怎么辦,電腦無響應是怎么回事 電腦無響應解決方法

電腦無響應是怎么回事?有時用戶再操作過程中想在任務欄中切換窗口時&#xff0c;忽然發現點擊任務欄中的圖標沒有任何反應了&#xff0c;就像系統死機一樣&#xff0c;這就是Windows XP中常見的任務欄失去響應&#xff0c;又被稱為“任務欄假死現象”。那么&#xff0c;如何喚…

2020身高體重標準表兒童_男女孩最新身高標準表,你家孩子達標了嗎?(附增高秘籍)...

現在大家的生活水平提高了&#xff0c;和很多年前相比&#xff0c;孩子們的平均身高提高了不少&#xff0c;孩子能長成一個高個子&#xff0c;也是很多家長非常關注的事情。其實&#xff0c;要想孩子長高&#xff0c;除了營養要跟上以外&#xff0c;充足的睡眠、體重不要太胖都…

java 正則匹配_正則表達式真的很強大,可惜你不會寫

專注于Java領域優質技術&#xff0c;歡迎關注本文旨在用最通俗的語言講述最枯燥的基本知識文章提綱&#xff1a;元字符重復限定符分組轉義條件或區間正則表達式在幾乎所有語言中都可以使用&#xff0c;無論是前端的JavaScript、還是后端的Java、c#。他們都提供相應的接口/函數支…

河北大學計算機復試題,2016年河北大學綜合卷計算機科學與技術學院之數據庫系統概論復試筆試最后押題五套卷...

一、選擇題1&#xff0e; 根據系統所提供的存取路徑&#xff0c;選擇合理的存取策略&#xff0c;這種優化方式稱為( )。A. 物理優化B. 代數優化C. 規則優化D. 代價估算優化【答案】A【解析】物理優化是根據數據字典中的存取路徑、數據的存儲分布以及聚簇情況等信息來選擇低層的…

python測驗5 函數和代碼_測驗5: 函數和代碼復用 (第5周)-單選題

1、以下選項不是函數作用的是&#xff1a;???????????????????????????????????????????????????????????????????????????????? A、 提高代碼執行速度 B、 復用代碼 C、 降低編程復雜度 D、…

石板切割問題c語言_廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪...

廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪廣場地面鋪裝 仿古石 青石板 板巖 切割巖 冰裂紋壓印混凝土地坪青石板是由青色的沉積巖劈制或者切割而成的板材&#xff0c;是天然板巖的一種&#xff0c;主要成分為石灰石、白云石。其比重約2.2~2.7克/立方厘米&a…

編程doc轉html,Python批量將word轉html,并將html內容發布至網站。

搜索熱詞下面是編程之家 jb51.cc 通過網絡收集整理的代碼片段。編程之家小編現在分享給大家&#xff0c;也給大家做個參考。#codingutf-8__author__ zhmfrom win32com import client as wcimport osimport timeimport randomimport MysqLdbimport redef wordsToHtml(dir):#批量…

python分析工具有哪些_常用Python數據分析工具匯總

Python是數據處理常用工具&#xff0c;可以處理數量級從幾K至幾T不等的數據&#xff0c;具有較高的開發效率和可維護性&#xff0c;還具有較強的通用性和跨平臺性。Python可用于數據分析&#xff0c;但其單純依賴Python本身自帶的庫進行數據分析還是具有一定的局限性的&#xf…

python軟件是什么原因引起的_Python對程序員重要的原因在哪里?

Python 之父Fredrik Haard最近發表了一篇“為什么Python對你如此重要”的文章&#xff0c;引起了開發者的熱烈討論。我相信Python對軟件開發人員很重要。現今已經誕生了不少的編程語言&#xff0c;它們都有各自不同的特性&#xff1a;強大者如Lisp&#xff0c;快速如C&#xff…

大學計算機需要論文嗎,關于大學計算機論文范文.docx

關于大學計算機論文范文一&#xff1a;大學計算機基礎實驗教學課程改革計算機基礎是高校非計算機專業非常重要的一門公共基礎課程&#xff0c;課程內容是大學生必須掌握的計算機基礎知識和操作技能&#xff0c;是大學生走向工作崗位必備的基本素質。計算機基礎知識的掌握與實際…

高并發編程_高并發編程系列:全面剖析Java并發編程之AQS的核心實現

在并發編程領域&#xff0c;AQS號稱是并發同步組件的基石&#xff0c;很多并發同步組件都是基于AQS實現&#xff0c;所以想掌握好高并發編程&#xff0c;你需要掌握好AQS。本篇主要通過對AQS的實現原理、數據模型、資源共享方式、獲取鎖的過程&#xff0c;讓你對AQS的整體設計有…

python怎么測試c代碼_如何正確測試python中的C-API,C-API返回錯誤代碼

我的設置 我正在使用Python中的pytest和ctypes測試C庫中的函數。C庫中的每個函數調用一個嵌入式linux PCI板上的函數&#xff0c;然后C庫函數返回一個整數&#xff0c;該整數映射到一組返回代碼。如果函數成功&#xff0c;則返回0&#xff0c;否則返回其他錯誤代碼。在 問題 我…

計算機考試設計會議邀請函,計算機二級常見考點之使用合并技術制作邀請函

計算機01:37來自LearningYard學苑三月份的計算機二級考試即將到來&#xff0c;不知道各位童鞋準備得怎么樣了呢&#xff0c;把握了多少。今天小編就給講講計算機二級MS office中常見的考核內容——使用合并技術制作邀請函。The computer second-level exam in March is coming …

添加一列_辦公軟件操作技巧023:如何給excel數據批量添加單位

在日常工作中&#xff0c;我們使用excel編輯電子表格時&#xff0c;經常需要給數據添加單位&#xff0c;單位是編制excel表格常用的元素&#xff0c;有時我們需要給一列數字都添加上單位&#xff0c;比如長度多少米&#xff0c;金額多少元&#xff0c;貨物多少公斤等等&#xf…

html代碼大全(很全的)_HTML教學(1):寫一個屬于自己的網址大全(新手版)

超文本標記語言&#xff08;Hyper Text Markup Language&#xff09;&#xff0c;縮寫為HTML&#xff0c;標準通用標記語言下的一個應用。HTML不是一種編程語言&#xff0c;而是一種標記語言 &#xff08;markup language&#xff09;只要你打開瀏覽器&#xff0c;第一眼看到的…

清華大學計算機系高考生源,清華大學在這個高考大省錄取人數創新高,網友:仍然是同分不同命...

在眾多高考學子眼中&#xff0c;只有“兩個學校”&#xff0c;一個是“清華、北大”&#xff0c;一個是“其他學校”&#xff0c;不僅是高考學子&#xff0c;清華、北大在眾多人心目中也是十分神圣的。很多學生家長把考上清華、北大作為子女的唯一追求&#xff0c;認為只有考上…

list的contains方法為什么不好使_道理都懂,為什么我們還打不好網球?

中年人的悲哀在于&#xff0c;懂得很多道理&#xff0c;可依然過不好自己的一生。打網球亦是如此。——題記人到中年&#xff0c;有了一定的社會經驗&#xff0c;也懂得了很多道理&#xff0c;可大部分人還是過不好自己的生活。正如打網球一樣。盯準球、早點打、降低重心、保持…

docker公共存儲庫_Docker Hub公共鏡像倉庫的使用

Docker Hub目前 Docker 官方維護了一個公共倉庫 Docker Hub&#xff0c;其中已經包括了數量超過 15,000 的鏡像。大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現。Docker Hub的功能Docker Hub被用于源代碼管理集成&#xff0c;也用于構建和測試工具來加速部署周期&am…

html5登錄界面源代碼_最新版本尤娜博客已更新源代碼(速拿!!!)

大家好&#xff0c;我是尤娜博客(una-boot)的作者樹下魅狐&#xff0c;自2019年9月una-boot-1.0.0版本開源以來&#xff0c;陸續有熱愛技術&#xff0c;鐘愛技術寫作的小伙伴為尤娜提出了寶貴的改進意見和建議&#xff0c;在此表示衷心的感謝&#xff0c;謝謝大家的支持&#x…