Qt編寫視覺化大屏電子看板系統31-模組9視訊監控
阿新 • • 發佈:2022-03-29
一、前言
視訊監控模組採用ffmpeg作為解碼核心,可以在系統設定中填入一個視訊地址,同時支援本地視訊檔案、USB攝像機、遠端onvif攝像機(海康大華等)、網路視訊地址,大屏系統中預設有一個視訊監控,如果需要顯示多個則new多個視訊監控模組即可,在本系統中每個最小單元的小模組都是一個類,需要多少個就可以new多少個出來顯示,二級模組作為一個懸停窗體嵌入主介面mainwindow,都可以拖動到任意位置自動嵌入。
視訊監控模組有多個引數設定,以便使用者設定,最開始做的是內建的寫死在程式碼中,後面隨著使用者場景的變化,留出引數使用者設定更靈活,引數如下:
- 視訊拉伸:有些客戶需要拉伸填充有些需要等比例縮放;
- 視訊回撥:有些板子或者電腦沒有opengl或者版本過低需要開啟視訊回撥才能正常繪製圖像;
- 播放音訊:開啟後會播放視訊和視訊流中的聲音;
- 視訊迴圈:開啟後播放視訊完成後會立即重複播放;
- 超時時間:開啟視訊的超時時間,有些網路地址需要設定久一點;
- 通訊方式:視訊流採用TCP還是UDP協議播放;
視訊監控核心功能特點:
- 多執行緒實時播放視訊流+本地視訊+USB攝像頭等。
- 支援windows+linux+mac,支援ffmpeg3和ffmpeg4,支援32位和64位。
- 多執行緒顯示影象,不卡主介面。
- 自動重連網路攝像頭。
- 可設定邊框大小即偏移量和邊框顏色。
- 可設定是否繪製OSD標籤即標籤文字或圖片和標籤位置。
- 可設定兩種OSD位置和風格。
- 可設定是否儲存到檔案以及檔名。
- 可直接拖曳檔案到ffmpegwidget控制元件播放。
- 支援h265視訊流+rtmp等常見視訊流。
- 可暫停播放和繼續播放。
- 支援儲存單個視訊檔案和定時儲存視訊檔案。
- 自定義頂部懸浮條,傳送單擊訊號通知,可設定是否啟用。
- 可設定畫面拉伸填充或者等比例填充。
- 可設定解碼是速度優先、質量優先、均衡處理。
- 可對視訊進行截圖(原始圖片)和截圖。
- 錄影檔案儲存支援裸流和MP4檔案。
- 音視訊完美同步,採用外部時鐘同步策略。
- 支援seek定位播放位置。
- 支援線上網路音視訊檔案比如http開頭mp4、mp3結尾的。
- 可選控制代碼模式(GPU繪製)、回撥模式(QPainter繪製)。
- GPU繪製模式同時支援拉伸和等比例繪製。
- 支援qsv、dxva2、d3d11va等硬解碼。
- 硬解碼和GPU組合,超低CPU佔用,支援64路視訊。
- 支援安卓和嵌入式linux,交叉編譯即可。
二、功能特點
- 採用分層設計,整體總共分三級介面,一級介面是整體佈局,二級介面是單個功能模組,三級介面是單個控制元件。
- 子控制元件包括餅圖、圓環圖、曲線圖、柱狀圖、柱狀分組圖、橫向柱狀圖、橫向柱狀分組圖、合格率控制元件、百分比控制元件、進度控制元件、裝置狀態面板、表格資料、地圖控制元件、視訊控制元件等。
- 二級介面可以自由拖動懸浮,支援最小化隱藏、最大化關閉、響應雙擊自定義標題欄。
- 資料來源支援模擬資料(預設)、資料庫採集、串列埠通訊(需定製)、網路通訊(需定製)、網路請求等,可自由設定每個子介面的採集間隔即資料重新整理頻率。
- 採用純QWidget編寫,親測Qt4.6到Qt6.2任意版本,理論上支援後續其他Qt版本。
- 超強跨平臺,親測windows、linux、mac、國產uos、國產銀河麒麟kylin等系統,效果完美,同時還支援嵌入式linux比如樹莓派、香橙派、全志、imx6等。
- 同時集成了自定義控制元件、qchart餅圖、echart地圖等功能。
- 內建多套配色風格樣式(紫色、藍色、深藍、黑色),預設紫色,自適應任意解析度。
- 可設定系統標題、目標解析度、佈局方案,啟動立即應用。
- 可設定主背景顏色、面板顏色、十字線遊標顏色等各種顏色。
- 可設定多條曲線不同顏色,沒有設定顏色的情況下內建多套精美顏色隨機應用。
- 可設定標題欄背景顏色、文字顏色。
- 可設定曲線圖表背景顏色、文字顏色、網格顏色。
- 可設定正常顏色、警戒顏色、報警顏色、禁用顏色、百分比進度顏色。
- 可分別設定各種字型大小,比如全域性字型、軟體名稱、標題欄、子標題欄、加粗標籤等。
- 可設定標題欄高度、表頭高度、行高度。
- 曲線支援遊標、定位線、懸停高亮資料點、懸停顯示值。
- 柱狀圖支援頂部(可設定頂端、上部、中間、底部)顯示資料,全部自適應計算位置。
- 支援平滑曲線,內建多種平滑曲線演算法,還支援面積圖平滑。
- 面積圖填充顏色可選多種規則比如單色透明度填充、透明度漸變填充等。
- 資料庫支援sqlite、mysql、postgresql、oracle、國產人大金倉等資料庫。
- 主介面直接滑鼠右鍵切換佈局、配色方案、關閉開啟某個二級窗體。
- 自動記憶所有子視窗的大小和位置,下次啟動立即應用。
- 動態載入佈局方案選單,可以動態新建佈局、恢復佈局、儲存佈局、另存佈局等,使用者可以製造任意佈局。
- 二級窗體,雙擊從主窗體分離出來浮動,可以自由調整大小。再次雙擊標題欄最大化,再次雙擊還原。
- 子模組也可以全屏顯示作為一個大屏,這樣就可以一個大屏拓展出多個子大屏,放大檢視子模組的資料詳情,適用多屏展示。
- 每個模組都可以自定義採集速度,如果是資料庫採集會自動排隊處理,後期還可以拓展每個子模組都獨立的資料庫採集。
- 提供系統設定模組進行整體的配置引數設定,效果立即應用。
- 提供精美炫酷的大屏地圖模組,包括靜態圖片、閃爍效果、遷徙效果、世界地圖、區域地圖等,可指定點的經緯度座標,識別單擊響應,可以做地圖跳轉等,每個點都可以不同的顏色和提示資訊。
- 除了提供大屏系統外,還將每個模組都做了獨立的模組示例介面,每個模組都可以獨立學習使用,裡面用到的控制元件也單獨做了控制元件示例介面,方便學習每個控制元件如何使用。
- 非常詳細的開發和使用手冊,其中包括資料庫說明、模組對照圖、控制元件對照圖、專案結構、程式碼說明(精確到每個類)、演示demo、使用方法等。
三、體驗地址
- 體驗地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 檔名:bin_bigscreen.zip。
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人主頁:https://blog.csdn.net/feiyangqingyun
- 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/
- 線上文件:https://feiyangqingyun.gitee.io/qwidgetdemo/bigscreen/
四、效果圖
五、核心程式碼
#include "frmmodulevideo.h"
#include "ui_frmmodulevideo.h"
#include "quihelper.h"
frmModuleVideo::frmModuleVideo(QWidget *parent) : QWidget(parent), ui(new Ui::frmModuleVideo)
{
ui->setupUi(this);
this->initForm();
}
frmModuleVideo::~frmModuleVideo()
{
delete ui;
}
void frmModuleVideo::showEvent(QShowEvent *)
{
#ifdef videoffmpeg
//延時處理不然佈局載入後會先顯示再隱藏瞬間反覆來兩次導致隱藏的時候無法暫停
QTimer::singleShot(200, this, SLOT(open()));
if (!isLoad) {
isLoad = true;
} else {
videoWidget->next();
}
#endif
}
void frmModuleVideo::hideEvent(QHideEvent *)
{
#ifdef videoffmpeg
//介面不可見的時候暫停以節省資源
videoWidget->pause();
#endif
}
void frmModuleVideo::initForm()
{
isLoad = false;
url = AppConfig::VideoUrl;
#ifdef videoffmpeg
videoWidget = new FFmpegWidget;
videoWidget->setBorderWidth(0);
videoWidget->setBgText("");
//設定拉伸填充影象
videoWidget->setFillImage(AppConfig::VideoFillImage);
//設定是否回撥,有些嵌入式環境只能用回撥
videoWidget->setCallback(AppConfig::VideoCallback);
//設定是否播放聲音
videoWidget->setPlayAudio(AppConfig::VideoPlayAudio);
//設定是否重複播放
videoWidget->setPlayRepeat(AppConfig::VideoPlayRepeat);
//設定開啟超時時間,一些推流要把時間設定大一些
videoWidget->setCheckTime(AppConfig::VideoCheckTime * 1000);
//設定視訊流通訊協議
videoWidget->setTransport(AppConfig::VideoTransport);
//把視訊控制元件加到佈局中
ui->widgetMain->layout()->addWidget(videoWidget);
#endif
}
void frmModuleVideo::setUrl(const QString &url)
{
this->url = url;
}
void frmModuleVideo::open()
{
#ifdef videoffmpeg
if (isVisible() && !videoWidget->getIsPlaying()) {
videoWidget->setUrl(url);
videoWidget->open();
}
#endif
}