偃師制作網(wǎng)站怎么去營銷自己的產(chǎn)品
一、前言說明
近期對(duì)視頻監(jiān)控系統(tǒng)做了比較大的更新升級(jí),主要就是三點(diǎn),第一點(diǎn)就是增加了輔屏預(yù)覽,這個(gè)也是好多個(gè)客戶需要的功能,??档膇VMS-4200客戶端就有這個(gè)功能,方便在多個(gè)屏幕打開不同的視頻進(jìn)行查看,比如有100個(gè)通道,如果只是在一個(gè)屏幕上查看,那就太小了,而現(xiàn)在很多電腦都是多屏幕,每個(gè)屏幕放個(gè)32個(gè),相對(duì)來說畫面就大了很多,如果軟件上直接多開幾個(gè)預(yù)覽的畫面就方便多了。
第二點(diǎn)就是多層級(jí)的設(shè)備樹,這個(gè)功能積壓了很久,之前都是兩個(gè)層級(jí),第一層是NVR名稱或者分組,第二層就是子設(shè)備也就是攝像頭,對(duì)于設(shè)備數(shù)量很少的時(shí)候關(guān)系不大,現(xiàn)在很多用戶需要接入的設(shè)備都是成百上千,而且有諸多分組,分組還不止一個(gè)層級(jí),比如集團(tuán)內(nèi)部光銷售部就有很多子分組,所以必須能夠支持多層級(jí)的分組,稍微費(fèi)了點(diǎn)做成了通用模塊。
第三點(diǎn)就是一個(gè)定制的功能,本系統(tǒng)支持非常友好的二開,盡最大化的可能,將常用的功能都封裝成了靜態(tài)的函數(shù),可以直接調(diào)用,引入對(duì)應(yīng)的頭文件即可,而且都有使用示例參考。近期一個(gè)用戶需要定制網(wǎng)絡(luò)登錄的功能,也就是利用現(xiàn)有的視頻監(jiān)控系統(tǒng)框架,將登錄變成網(wǎng)絡(luò)登錄,然后設(shè)備信息也都是通過網(wǎng)絡(luò)請(qǐng)求獲取,視頻回放也是請(qǐng)求拉回來的地址播放,錄像文件通過網(wǎng)絡(luò)下載到本地,打上水印等。
二、效果圖
三、相關(guān)代碼
#include "frmvideowidgetslider.h"
#include "zdownload.h"
#include "zplayback.h"
#include "ui_zplayback.h"
#include "qthelper.h"
#include "deviceutil.h"
#include "deviceurl.h"
#include "videowidgetx.h"
#include "videohelper.h"
#include "videoutil.h"
#include "mediadata.h"
#include "mediahelper.h"ZPlayBack::ZPlayBack(QWidget *parent) : QWidget(parent), ui(new Ui::ZPlayBack)
{ui->setupUi(this);this->initForm();this->initIcon();this->initVideo();on_btnSelect_clicked();
}ZPlayBack::~ZPlayBack()
{delete ui;
}VideoWidget *ZPlayBack::getVideoWidget()
{return this->videoWidget;
}void ZPlayBack::initForm()
{ui->widgetRight->setFixedWidth(AppData::RightWidth);ui->calendarWidget->setFirstDayOfWeek(Qt::Sunday);ui->calendarWidget->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);ui->calendarWidget->setHorizontalHeaderFormat(QCalendarWidget::NoHorizontalHeader);doubleClickTime = QDateTime::currentDateTime();//添加設(shè)備for (int i = 0; i < MediaData::count; ++i) {ui->cboxCh->addItem(MediaData::name.at(i), MediaData::id.at(i));}//切換設(shè)備自動(dòng)生成播放文件connect(ui->cboxCh, SIGNAL(currentIndexChanged(int)), this, SLOT(on_btnSelect_clicked()));connect(ui->calendarWidget, SIGNAL(clicked(QDate)), this, SLOT(on_btnSelect_clicked()));VideoUtil::loadSpeed(ui->cboxSpeed);ui->cboxSpeed->setCurrentIndex(1);//關(guān)聯(lián)樣式改變信號(hào)自動(dòng)重新設(shè)置圖標(biāo)connect(AppEvent::Instance(), SIGNAL(changeStyle()), this, SLOT(initIcon()));//關(guān)聯(lián)按下行自動(dòng)切換選中狀態(tài)connect(ui->listWidget, SIGNAL(itemPressed(QListWidgetItem *)), AppEvent::Instance(), SLOT(slot_itemPressed(QListWidgetItem *)));//關(guān)聯(lián)下載完成信號(hào)connect(ZDownLoad::Instance(), SIGNAL(downFinsh()), this, SLOT(downFinsh()));
}void ZPlayBack::initIcon()
{//設(shè)置按鈕圖標(biāo)CommonNav::setIconBtn(ui->frameRight);
}void ZPlayBack::initVideo()
{videoWidget = new VideoWidget;connect(videoWidget, SIGNAL(sig_receivePlayStart(int)), this, SLOT(receivePlayStart(int)));connect(videoWidget, SIGNAL(sig_receivePlayFinsh()), this, SLOT(receivePlayFinsh()));DeviceUtil::initVideoWidget(videoWidget);//重新設(shè)置解碼策略/這里不能和其他地方的解碼策略一樣VideoPara para = videoWidget->getVideoPara();para.decodeType = DecodeType_Fast;videoWidget->setVideoPara(para);//設(shè)置背景文字videoWidget->setBgText("視頻文件");//可以單獨(dú)設(shè)置填充拉伸//videoWidget->setScaleMode(ScaleMode_Fill);videoSlider = new frmVideoWidgetSlider(videoWidget);ui->gridLayout->addWidget(videoSlider, 0, 0);//隨機(jī)動(dòng)態(tài)生成水印QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(initOsd()));timer->start(5000);
}void ZPlayBack::initOsd()
{if (videoWidget->getIsRunning()) {MediaHelper::setOsd(videoWidget->getVideoThread(), 10);}
}void ZPlayBack::receivePlayStart(int)
{//隨機(jī)生成多個(gè)水印this->initOsd();//設(shè)置播放速度on_cboxSpeed_currentIndexChanged(ui->cboxSpeed->currentIndex());
}void ZPlayBack::receivePlayFinsh()
{//自動(dòng)切換到下一個(gè)視頻/并執(zhí)行模擬雙擊事件if (!videoSlider->getIsStop() && ui->listWidget->currentRow() < ui->listWidget->count() - 1) {QDateTime now = QDateTime::currentDateTime();if (doubleClickTime.msecsTo(now) > 500) {ui->listWidget->setCurrentRow(ui->listWidget->currentRow() + 1);on_listWidget_doubleClicked();}}
}void ZPlayBack::downFinsh()
{ui->btnDownload->setEnabled(true);
}void ZPlayBack::on_btnSelect_clicked()
{if (ui->cboxCh->count() == 0) {return;}int id = ui->cboxCh->itemData(ui->cboxCh->currentIndex()).toInt();int index = MediaData::id.indexOf(id);if (index < 0) {return;}//啟用了模擬數(shù)據(jù)的時(shí)候用測(cè)試的地址QString url2 = "http://vd2.bdstatic.com/mda-mi1dd05gmhwejdwn/sc/cae_h264/1630576203346678103/mda-mi1dd05gmhwejdwn.mp4";ui->listWidget->clear();QString app = MediaData::app.at(index);QString stream = MediaData::stream.at(index);QString date = ui->calendarWidget->selectedDate().toString("yyyy-MM-dd");for (int i = 0; i < 24; ++i) {QString hour = QString("%1").arg(i, 2, 10, QChar('0'));QString hour2 = QString("%1").arg(i + 1, 2, 10, QChar('0'));QString url = QString("%1/%2/%3/%4/%5.m3u8").arg(OtherConfig::HttpVodUrl).arg(date).arg(app).arg(stream).arg(hour);url = QString("%1?uuid=%2&user=%3").arg(url).arg(MediaData::uuid).arg(AppConfig::LastLoginer);url = EnableConfig::EnableTestData ? url2 : url;QString name = QString("%1 %2:00 - %3:00").arg(date).arg(hour).arg(hour2);QListWidgetItem *item = new QListWidgetItem;item->setText(name);item->setData(Qt::UserRole, url);item->setCheckState(Qt::Unchecked);ui->listWidget->addItem(item);}
}void ZPlayBack::on_btnDownload_clicked()
{//取出勾選的要下載的視頻文件QStringList urls = DeviceUrl::getSelectUrls(ui->listWidget, true);if (urls.count() == 0) {return;}//取出要保存的地址QStringList files;QString path = OtherConfig::VideoNormalPath + "/2025-01-01";QtHelper::checkPath(path);for (int i = 0; i < urls.count(); ++i) {QString app = "1001";QString stream = "1";QString hour = QString("%1").arg(i, 2, 10, QChar('0'));QString file = QString("%1/%2_%3_%4.mp4").arg(path).arg(app).arg(stream).arg(hour);files << file;}ZDownLoad::Instance()->setUrls(urls, files);ZDownLoad::Instance()->show();ZDownLoad::Instance()->start();ui->btnDownload->setEnabled(false);
}void ZPlayBack::on_listWidget_doubleClicked()
{doubleClickTime = QDateTime::currentDateTime();QListWidgetItem *item = ui->listWidget->currentItem();QString url = item->data(Qt::UserRole).toString();videoWidget->open(url);
}void ZPlayBack::on_cboxSpeed_currentIndexChanged(int index)
{if (isVisible()) {double speed = ui->cboxSpeed->itemData(index).toDouble();videoWidget->setSpeed(speed);}
}
四、相關(guān)地址
- 國內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
- 國際站點(diǎn):https://github.com/feiyangqingyun
- 個(gè)人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_system。
五、功能特點(diǎn)
0.6.1 軟件模塊
- 視頻監(jiān)控模塊,各種停靠小窗體子模塊,包括設(shè)備列表、圖文警情、窗口信息、云臺(tái)控制、預(yù)置巡航、視頻輪詢、設(shè)備控制、懸浮地圖、網(wǎng)頁瀏覽等。
- 視頻回放模塊,包括本地回放、網(wǎng)絡(luò)回放、遠(yuǎn)程回放、圖片回放、視頻上傳等。
- 電子地圖模塊,包括圖片地圖、設(shè)備地圖、設(shè)備移動(dòng)、軌跡回放等。
- 日志查詢模塊,包括本地日志、設(shè)備日志等。
- 系統(tǒng)設(shè)置模塊,包括系統(tǒng)設(shè)置(基本設(shè)置、視頻參數(shù)、數(shù)據(jù)庫設(shè)置、顏色配置、功能激活等)、錄像機(jī)管理、攝像機(jī)管理、輪詢配置、錄像計(jì)劃、用戶管理、其他設(shè)置等。
0.6.2 基礎(chǔ)功能
- 支持各種音視頻流(rtsp、rtmp、http、srt、ws等)、音視頻文件(mp4、rmvb、avi等)、本地設(shè)備(本地?cái)z像頭、麥克風(fēng)、桌面)。
- 支持多畫面切換,包括1、4、6、8、9、13、16、25、36、64畫面切換。
- 支持全屏切換,多種切換方式包括鼠標(biāo)右鍵菜單、工具欄按鈕、快捷鍵(alt+enter全屏,esc退出全屏)。
- 支持視頻輪詢,包括1、4、9、16畫面輪詢,可設(shè)置輪詢分組(輪詢預(yù)案)、輪詢間隔、碼流類型等。
- 支持onvif協(xié)議,包括設(shè)備搜索、云臺(tái)控制、預(yù)置位管理、設(shè)備控制(圖片參數(shù)、校對(duì)時(shí)間、系統(tǒng)重啟、抓拍圖片、OSD配置、網(wǎng)絡(luò)配置等)。
- 支持權(quán)限管理,不同的用戶可以對(duì)應(yīng)不同的模塊權(quán)限,比如刪除日志、關(guān)閉系統(tǒng)等。
- 數(shù)據(jù)庫支持多種,包括sqlite、mysql、sqlserver、postgresql、oracle、人大金倉等。
- 支持本地設(shè)備采集比如本地桌面和攝像頭,支持設(shè)置分辨率、幀率等參數(shù),支持多屏幕。
- 所有停靠模塊都自動(dòng)生成對(duì)應(yīng)的菜單用來控制顯示和隱藏,在標(biāo)題欄右鍵可以彈出。
- 支持顯示所有模塊、隱藏所有模塊、復(fù)位普通布局、復(fù)位全屏布局。
- 支持圖片地圖和網(wǎng)頁地圖上雙擊設(shè)備圖標(biāo)彈出實(shí)時(shí)預(yù)覽。
- 攝像機(jī)節(jié)點(diǎn)拖曳到對(duì)應(yīng)窗體播放視頻,同時(shí)支持拖曳本地文件直接播放。
- 設(shè)備樹雙擊分組打開對(duì)應(yīng)分組下的所有視頻,雙擊設(shè)備子節(jié)點(diǎn)直接打開對(duì)應(yīng)設(shè)備視頻流。自動(dòng)加載最后展開的節(jié)點(diǎn)。
- 設(shè)備樹支持自定義配置,可以添加分組、刪除分組、修改分組,任意層級(jí)設(shè)置。
- 設(shè)備樹可以開啟是否放大字體顯示、是否顯示主碼流子碼流節(jié)點(diǎn)、是否隱藏空組(沒有設(shè)備的分組自動(dòng)隱藏)。
- 刪除視頻支持鼠標(biāo)右鍵刪除、懸浮條關(guān)閉刪除、拖曳到視頻監(jiān)控面板外刪除等多種方式。
- 圖片地圖上設(shè)備按鈕可自由拖動(dòng),自動(dòng)保存位置信息。地圖上可以鼠標(biāo)單擊獲取經(jīng)緯度信息,用來更新設(shè)備位置。
- 視頻監(jiān)控面板窗體中任意通道支持拖曳交換,瞬間響應(yīng)。
- 網(wǎng)頁地圖支持視圖切換、運(yùn)動(dòng)軌跡顯示、設(shè)備點(diǎn)位,鼠標(biāo)按下獲取經(jīng)緯度等。
- 雙擊節(jié)點(diǎn)、拖曳節(jié)點(diǎn)、拖曳窗體交換位置等操作,均自動(dòng)更新保存最后的播放地址,下次軟件打開自動(dòng)應(yīng)用。
- 右下角音量條控件,失去焦點(diǎn)自動(dòng)隱藏,音量條帶靜音圖標(biāo),自動(dòng)記憶最后的音量及靜音狀態(tài)。
- 支持視頻截圖,可指定單個(gè)或者對(duì)所有通道截圖,底部小工具欄也有截圖按鈕,每個(gè)視頻控件懸浮條也有抓拍按鈕。
- 支持輔屏預(yù)覽,可以打開多個(gè),在多個(gè)屏幕分別打開64通道,按需顯示視頻。
- 支持超時(shí)自動(dòng)隱藏鼠標(biāo)指針、自動(dòng)全屏機(jī)制。
- 支持onvif云臺(tái)控制,可上下左右移動(dòng)云臺(tái)攝像機(jī),包括復(fù)位和焦距調(diào)整等。
- 支持onvif預(yù)置位,可以添加、刪除、修改預(yù)置位,可以調(diào)用起始位。
- 支持OSD增刪改查,可以通過onvif協(xié)議添加及修改OSD信息。
- 支持onvif圖像參數(shù)設(shè)置,包括明亮度、對(duì)比度、飽和度、尖銳度等。
- 支持onvif其他操作,包括抓圖、網(wǎng)絡(luò)設(shè)置、校時(shí)、重啟、事件訂閱等。
- 支持任意onvif攝像機(jī),包括但不限于海康、大華、宇視、天地偉業(yè)、華為等。
- 可保存視頻,可通過錄像計(jì)劃存儲(chǔ),也可在懸浮條手動(dòng)切換開始錄像和停止錄像。
- 可設(shè)置視頻流通信方式tcp或udp,可設(shè)置視頻解碼是速度優(yōu)先、質(zhì)量?jī)?yōu)先、均衡處理、最快速度等。
- 可設(shè)置軟件中文名稱、英文名稱、LOGO圖標(biāo)等。
- 存儲(chǔ)的視頻文件支持導(dǎo)出到指定目錄,支持批量上傳到服務(wù)器。
- 完善的錄像計(jì)劃設(shè)置,支持每個(gè)通道7 * 24小時(shí)每半小時(shí)設(shè)置是否存儲(chǔ)錄像。
- 音視頻同步顯示以及音視頻同步存儲(chǔ)到MP4文件。
0.6.3 特色功能
- 主界面采用??看绑w模式,各種組件以小模塊的形式加入,可自定義任意模塊加入。
- ??磕K可拖動(dòng)任意位置嵌入和懸浮,支持最大化全屏,支持多屏幕。
- 雙重布局文件存儲(chǔ)機(jī)制,正常模式、全屏模式都對(duì)應(yīng)不同的布局方案,自動(dòng)切換和保存,比如全屏模式可以突出幾個(gè)模塊透明顯示在指定位置,更具科幻感現(xiàn)代化。
- 原創(chuàng)onvif協(xié)議機(jī)制,采用底層協(xié)議解析(udp廣播搜索+http請(qǐng)求執(zhí)行命令)更輕量易懂易學(xué)習(xí)拓展,不依賴任何第三方組件比如gsoap。
- 原創(chuàng)數(shù)據(jù)導(dǎo)入、導(dǎo)出、打印機(jī)制,跨平臺(tái)不依賴任何組件,瞬間導(dǎo)出數(shù)據(jù)。
- 內(nèi)置多個(gè)原創(chuàng)組件,宇宙超值超級(jí)牛逼,包括數(shù)據(jù)導(dǎo)入導(dǎo)出組件(導(dǎo)出到xls、pdf、打印)、數(shù)據(jù)庫組件(數(shù)據(jù)庫管理線程、自動(dòng)清理數(shù)據(jù)線程、萬能分頁、數(shù)據(jù)請(qǐng)求等)、地圖組件、視頻監(jiān)控組件、文件多線程收發(fā)組件、onvif通信組件、通用瀏覽器內(nèi)核組件等。
- 自定義信息框、錯(cuò)誤框、詢問框、右下角提示框(包含多種格式)等。
- 精美換膚,高達(dá)20套皮膚樣式隨意更換,所有樣式全部統(tǒng)一,包括菜單等。
- 選中通道對(duì)應(yīng)設(shè)備樹節(jié)點(diǎn)高亮,選中通道節(jié)點(diǎn)對(duì)應(yīng)視頻控件高亮,方便查看當(dāng)前通道信息。
- 視頻控件懸浮條可以自行增加多個(gè)按鈕,監(jiān)控界面底部小工具欄也可自行增加按鈕。
- 雙擊攝像機(jī)節(jié)點(diǎn)自動(dòng)播放視頻,雙擊節(jié)點(diǎn)自動(dòng)依次添加視頻,會(huì)自動(dòng)跳到下一個(gè),雙擊父節(jié)點(diǎn)自動(dòng)添加該節(jié)點(diǎn)下的所有視頻??蛇x主碼流、子碼流。
- 錄像機(jī)管理、攝像機(jī)管理,可添加刪除修改導(dǎo)入導(dǎo)出打印信息,立即應(yīng)用新的設(shè)備信息生成樹狀列表,不需重啟。
- 攝像機(jī)搜索支持一鍵搜索和批量添加,支持onvif的NVR一鍵添加子設(shè)備,可以手動(dòng)設(shè)置開始地址和數(shù)量一鍵生成攝像機(jī)信息。
- 可選多種內(nèi)核自由切換,ffmpeg、vlc、mpv等,均可在pro中設(shè)置。推薦用ffmpeg,跨平臺(tái)最多,默認(rèn)提供好了linux和mac平臺(tái)上編譯好的庫。
- 支持windows、linux、macos等系統(tǒng)硬解碼,還支持嵌入式linux RKMPP硬解碼,可設(shè)置硬解碼類型(dxva2、d3d11va、vaapi、vdpau等)。
- 各種模塊可以勾選是否激活,方便根據(jù)實(shí)際需求搭配各種組合,比如隱藏電子地圖模塊,隱藏遠(yuǎn)程回放模塊只保留本地回放等。
- 盡最大化可能,將常用的功能封裝接口,全局靜態(tài)函數(shù)調(diào)用,極其容易使用,提供各種使用示例,方便用戶二開。
- 默認(rèn)采用opengl繪制視頻,超低的CPU資源占用,支持yuyv和nv12兩種格式繪制,性能爆表。
- 標(biāo)簽和圖形信息支持三種繪制方式,繪制到遮罩層、繪制到圖片、源頭繪制(對(duì)應(yīng)信息可以存儲(chǔ)到文件)。
- 包括但不限于視頻監(jiān)控內(nèi)核組件的所有功能,可參閱說明書中功能介紹 [視頻監(jiān)控內(nèi)核](###8.1 視頻監(jiān)控內(nèi)核)。
- 高度可定制化,用戶可以很方便的在此基礎(chǔ)上衍生自己的功能,比如增加自定義模塊,增加運(yùn)行模式、機(jī)器人監(jiān)控、無人機(jī)監(jiān)控、挖掘機(jī)監(jiān)控、廣播監(jiān)控等。
- 支持xp、win7、win10、win11、linux、mac、各種國產(chǎn)系統(tǒng)(UOS、中標(biāo)麒麟、銀河麒麟等)、嵌入式linux等系統(tǒng)。
- 注釋完整,項(xiàng)目結(jié)構(gòu)清晰,超級(jí)詳細(xì)完整的使用開發(fā)手冊(cè),精確到每個(gè)代碼文件的功能說明,不斷持續(xù)迭代版本。