首页
/
每日頭條
/
科技
/
監控技術的編程語言
監控技術的編程語言
更新时间:2024-10-11 14:21:26
## 一、前言

之前用ffmpeg解碼的時候,已經做了硬解碼的處理,比如支持qsv、dxva2、d3d11va等方式進行硬解碼處理,但是當時解碼出來以後,還是重新轉成了QImage來繪制,這樣就大打折扣了,盡管可以看到GPU使用率有了,但是依然耗時的操作還是在CPU繪制顯示,這就顯得很尴尬了,Qt封裝了大部分的opengl的操作,直接做成了QOPenGLWidget,既支持ffmpeg解碼出來的yuyv格式的數據顯示,還支持硬解碼出來的nv12格式的數據顯示,很好很強大,這樣的話就大大減輕了CPU的壓力,專門交給GPU繪制,經過這麼一番徹底的改造,效率提升至少5倍,不要太牛逼!如果開啟了opengl繪制,則對應内存會增加不少,可能opengl繪制需要開辟很多的内存來交換數據吧。

采用GPU顯示需要同時支持yuyv格式和nv12格式,因為有些配置差的電腦,硬解碼很可能歇菜,此時就需要用opengl來直接繪制ffmpeg軟解碼出來的yuyv數據,做到自動切換,這樣就兼容了所有的可能的情況。測試發現ffmpeg4的性能要優于ffmpeg3,64位的性能要優于32位的,在64位的操作系統上,UDP協議性能要優于TCP性能,但是可能會丢包。

下面是本人測試的結果:

測試數據,64位WIN10 32位qt5.7 32位ffmpeg3 6路1080P主碼流 6路子碼流

| 方案 | CPU | 内存 | GPU |

| ------ | ------ | ------ | ------ |

| none none | 12% | 147MB | 0% |

| dxva2 none | 3% | 360MB | 38% |

| d3d11va none | 2% | 277MB | 62% |

| none painter | 30% | 147MB | 0% |

| dxva2 painter | 30% | 360MB | 38% |

| d3d11va painter | 21% | 277MB | 62% |

| none yuyv | 17% | 177MB | 22% |

| dxva2 yuyv | 25% | 400MB | 38% |

| d3d11va yuyv | 18% | 30MB | 65% |

| qsv nv12 | 22% | 970MB | 40% |

| dxva2 nv12 | 20% | 380MB | 40% |

| d3d11va nv12 | 15% | 320MB | 62% |

## 二、功能特點

1. 支持多畫面切換,全屏切換等,包括1 4 6 8 9 13 16 25 36 64畫面切換。

2. 支持alt enter全屏,esc退出全屏。

3. 自定義信息框 錯誤框 詢問框 右下角提示框(包含多種格式)。

4. 17套皮膚樣式随意更換,所有樣式全部統一,包括菜單等。

5. 雲台儀表盤鼠标移上去高亮,八個方位精準識别。

6. 底部畫面工具欄(畫面分割切換 截圖聲音等設置)移上去高亮。

7. 可在配置文件更改左上角logo 中文軟件名稱 英文軟件名稱。

8. 封裝了百度地圖,視圖切換,運動軌迹,設備點位,鼠标按下獲取經緯度等。

9. 支持圖片地圖,設備按鈕可以在圖片地圖上自由拖動自動保存位置信息。

10. 在百度地圖和圖片地圖上,雙擊視頻可以預覽攝像頭實時視頻。

11. 堆棧窗體,每個窗體都是個單獨的qwidget,方便編寫自己的代碼。

12. 頂部鼠标右鍵菜單,可動态控制時間CPU 左上角面闆 左下角面闆 右上角面闆 右下角面闆的顯示和隐藏,支持恢複默認布局。

13. 工具欄可以放置多個小圖标和關閉圖标。

14. 左側右側可拖動拉伸,并自動記憶寬高位置,重啟後恢複。

15. 雙擊攝像機節點自動播放視頻,雙擊節點自動依次添加視頻,會自動跳到下一個,雙擊父節點自動添加該節點下的所有視頻。

16. 攝像機節點拖曳到對應窗體播放視頻,同時支持拖曳本地文件直接播放。

17. 視頻畫面窗體支持拖曳交換,瞬間響應。

18. 雙擊節點 拖曳節點 拖曳窗體交換位置,均自動更新url.txt。

19. 支持從url.txt中加載通道視頻播放,自動記憶最後通道對應的視頻,軟件啟動後自動打開播放。

20. 右下角音量條控件,失去焦點自動隐藏,音量條帶靜音圖标。

21. 集成百度在線地圖和離線地圖,可以添加設備對應位置,自動生成地圖,支持縮放和添加覆蓋物等。

22. 視頻拖動到通道窗體外自動删除視頻。

23. 鼠标右鍵可删除當前 所有視頻,截圖當前 所有視頻。

24. 錄像機管理、攝像機管理,可添加删除修改導入導出打印信息,立即應用新的設備信息生成樹狀列表,不需重啟。

25. 在pro文件中可以自由開啟是否加載地圖。

26. 視頻播放可選2種内核自由切換,vlc ffmpeg,均可在pro中設置。

27. 可設置1 4 9 16畫面輪詢,可設置輪詢間隔以及輪詢碼流類型等,直接在主界面底部工具欄右側單擊啟動輪詢按鈕即可,再次單擊停止輪詢。

28. 默認超過10秒鐘未操作自動隐藏鼠标指針。

29. 支持onvif搜素設備,支持任意onvif攝像機,包括但不限于海康大華宇視天地偉業華為等。

30. 支持onvif雲台控制,可上下左右移動雲台攝像機,包括複位和焦距調整等。

31. 同時支持sqlite、mysql、postsql等數據庫。

32. 可保存視頻,可選定時存儲或者單文件存儲,可選存儲間隔時間。

33. 可設置視頻流通信方式tcp udp,可設置視頻解碼是速度優先、質量優先、均衡等。

34. 可設置硬解碼類型,支持qsv、dxva2、d3d11va等。

35. 默認采用opengl繪制視頻,超低的CPU資源占用,支持yuyv和nv12兩種格式繪制,很牛逼。

36. 高度可定制化,用戶可以很方便的在此基礎上衍生自己的功能,支持linux和mac系統。

## 三、效果圖

監控技術的編程語言(Qt編寫安防監控系統27-GPU顯示)1

## 四、核心代碼

void NV12OpenGLWidget::initializeGL() { initializeOpenGLFunctions(); glDisable(GL_DEPTH_TEST); //存儲頂點坐标和紋理坐标 static const GLfloat points[] = {-1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f}; //頂點緩沖對象初始化 vbo.create(); vbo.bind(); vbo.allocate(points, sizeof(points)); //初始化shader this->initShader(); //初始化textures this->initTextures(); //初始化顔色 this->initColor(); } void NV12OpenGLWidget::paintGL() { if (!dataY || !dataUV || width == 0 || height == 0) { this->initColor(); return; } program.bind(); program.enableAttributeArray("vertexIn"); program.enableAttributeArray("textureIn"); program.setAttributeBuffer("vertexIn", GL_FLOAT, 0, 2, 2 * sizeof(GLfloat)); program.setAttributeBuffer("textureIn", GL_FLOAT, 2 * 4 * sizeof(GLfloat), 2, 2 * sizeof(GLfloat)); glActiveTexture(GL_TEXTURE0 1); glBindTexture(GL_TEXTURE_2D, textureY); //字節對齊,網上很多代碼都是少了這一步,導緻有時候花屏 glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeY); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, dataY); glActiveTexture(GL_TEXTURE0 0); glBindTexture(GL_TEXTURE_2D, textureUV); //字節對齊,網上很多代碼都是少了這一步,導緻有時候花屏 glPixelStorei(GL_UNPACK_ROW_LENGTH, linesizeUV >> 1); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D, 0, GL_RG, width >> 1, height >> 1, 0, GL_RG, GL_UNSIGNED_BYTE, dataUV); glDrawArrays(GL_QUADS, 0, 4); program.setUniformValue("textureY", 1); program.setUniformValue("textureUV", 0); program.disableAttributeArray("vertexIn"); program.disableAttributeArray("textureIn"); program.release(); }

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
電腦開機慢黑屏還連不上網怎麼辦
電腦開機慢黑屏還連不上網怎麼辦
1、試試開機,出完電腦品牌後,按F8,回車,回車,進安全模式裡,高級啟動選項,最後一次正确配置,回車,回車,按下去試試。2、再不行,進安全模式,正常啟動,回車,到桌面後,全盤殺毒!3、使用360安全衛士,木馬查殺”裡的:360系統急救箱”,系統修複,然後點擊全選,立即修複即可。
2024-10-11
蘋果手機發燙怎麼辦
蘋果手機發燙怎麼辦
1、關閉不使用的後台運行程序,清理手機内存垃圾,手機特别燙手的重啟一下會有不錯的改善2、用紙巾蘸一點水,讓紙巾濕透,再把濕紙巾包裹住手機機身,這個散熱原理就是熱傳遞的原理。3、在夏天或者特别熱的環境下,最好别戴太厚或者散熱不好的手機套,最好選用金屬手機套4、可以将手機後蓋部分對準空調或者風扇的出風口,讓冷風吹到手機内部,加快手機的散熱速度。5、不使用的時候關閉藍牙GPS無線同步傳輸,盡量調低手機亮
2024-10-11
卡羅拉的自動啟停正确使用方法
卡羅拉的自動啟停正确使用方法
1、卡羅拉除了低配手動檔外,其餘車型都是配備了自動啟停。自動啟停是默認開啟的,隻要汽車發動,自動啟停系統就處于正常工作的狀态,當你開車遇到紅綠燈或者其他原因停車的時候,踩下刹車,一般兩秒後發動機就會自動熄火,然後,要走了,你再松開刹車踩油門,或者輕輕轉動方向盤的時候,發動機就再次啟動。2、另外,卡羅...
2024-10-11
視頻定向流量是什麼意思
視頻定向流量是什麼意思
演示機型:華為P40系統版本:EMUI11視頻定向流量是指在某一視頻軟件内使用的專屬流量。隻要不超過所訂購的定向流量包,所使用的流量不會從套餐流量包和其他通用流量包中扣除。因不同的定向流量包,能夠使用的軟件不同,具體定向流量的使用範圍建議咨詢歸屬地運營商客服熱線。流量(flow)是指連接網絡的設備在網絡上所産生的數據流量,也指在一定時間内打開網站地址的人氣訪問量。流量是一個數字記錄,能記錄一台設備
2024-10-11
電腦隐藏鍵盤在哪裡
電腦隐藏鍵盤在哪裡
1、鼠标右鍵點擊桌面,彈出右鍵菜單。在該菜單中點擊“新建”。2、在“新建”級聯菜單中點擊“快捷方式”...
2024-10-11
Copyright 2023-2024 - www.tftnews.com All Rights Reserved