通常視頻回放都會採用GB28181國標來處理,這樣能夠保證兼容國內各大廠家的NVR,畢竟在同一的國家標準下,你們都會統一支持國標的,就不須要根據各個廠家的SDK來作兼容處理,煩得很,廠家愈來愈多,SDK也愈來愈多,每一個廠家的接口未必一致,還要從新封裝SDK來處理。 我這個上面爲了簡化處理,並未加入GB28181的處理,交由用戶本身去處理,我只是單純的播放個視頻文件做爲demo,提供視頻回放控件,用於標識每一個通道,某些時間段有時間,提供遊標用於快速定位視頻位置,直接跳過去。linux
體驗地址:https://pan.baidu.com/s/1bbL2ZughZAgfIGrexyN-9g 提取碼:zkeh 。安全
監控系統是由攝像、傳輸、控制、顯示、記錄登記5大部分組成。攝像機經過同軸視頻電纜將視頻圖像傳輸到控制主機,控制主機再將視頻信號分配到各監視器及錄像設備,同時可將須要傳輸的語音信號同步錄入到錄像機內。 經過控制主機,操做人員可發出指令,對雲臺的上、下、左、右的動做進行控制及對鏡頭進行調焦變倍的操做,並可經過控制主機實如今多路攝像機及雲臺之間的切換。利用特殊的錄像處理模式,可對圖像進行錄入、回放、處理等操做,使錄像效果達到最佳。app
視頻監控系統由實時控制系統、監視系統及管理信息系統組成。實時控制系統完成實時數據採集處理、存儲、反饋的功能;監視系統完成對各個監控點的全天候的監視,能在多操做控制點上切換多路圖像;管理信息系統完成各種所需信息的採集、接收、傳輸、加工、處理,是整個系統的控制核心。視頻監控系統是安全防範系統的組成部分,它是一種防範能力較強的綜合系統。視頻監控以其直觀、方便、信息內容豐富而普遍應用於許多場合。ide
#include "frmvideoplayback.h" #include "ui_frmvideoplayback.h" #include "quiwidget.h" #include "iconfont.h" #include "videowidget.h" #ifdef videovlc #include "vlc.h" #elif videoffmpeg #include "ffmpeg.h" #elif easyplayer #include "easyplayer.h" #endif frmVideoPlayback::frmVideoPlayback(QWidget *parent) : QWidget(parent), ui(new Ui::frmVideoPlayback) { ui->setupUi(this); this->initForm(); this->initIcon(); this->initData(); this->initVideo(); //QTimer::singleShot(1000, this, SLOT(play_video_all())); } frmVideoPlayback::~frmVideoPlayback() { delete ui; } void frmVideoPlayback::showEvent(QShowEvent *) { this->initData(); } bool frmVideoPlayback::eventFilter(QObject *watched, QEvent *event) { if (event->type() == QEvent::MouseButtonDblClick) { if (watched->inherits("QWidget")) { QWidget *widget = (QWidget *) watched; if (!videoMax) { videoMax = true; hide_video_all(); widget->setVisible(true); } else { videoMax = false; show_video_all(); } widget->setFocus(); } } return QWidget::eventFilter(watched, event); } void frmVideoPlayback::initForm() { ui->navTree->setText("通道回放"); ui->navTree->setLeftIcon(0xf002); ui->navTree->setRightIcon5(0xf067); for (int i = 1; i <= 16; i++) { ui->cboxCh->addItem(QString("通道%1").arg(i)); } QStringList types; types << "運行視頻" << "報警視頻"; ui->cboxType->addItems(types); QStringList speeds; speeds << "半倍速度" << "正常速度" << "二倍速度" << "四倍速度" << "八倍速度" << "十六倍速度"; ui->cboxSpeed->addItems(speeds); ui->cboxSpeed->setCurrentIndex(1); ui->dateTimeStart->calendarWidget()->setLocale(QLocale::Chinese); ui->dateTimeEnd->calendarWidget()->setLocale(QLocale::Chinese); ui->dateTimeStart->setDate(QDate::currentDate()); ui->dateTimeEnd->setDate(QDate::currentDate().addDays(1)); } void frmVideoPlayback::initIcon() { quint32 size = 15; quint32 pixWidth = 20; quint32 pixHeight = 15; QSize iconSize = QSize(pixWidth, pixHeight); QPixmap pix1 = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, 0xf002, size, pixWidth, pixHeight); QPixmap pix2 = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, 0xf019, size, pixWidth, pixHeight); QPixmap pix3 = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, 0xf00d, size, pixWidth, pixHeight); QPixmap pix4 = IconHelper::Instance()->getPixmap(QUIConfig::TextColor, 0xf1f8, size, pixWidth, pixHeight); ui->btnSelect->setIconSize(iconSize); ui->btnDown->setIconSize(iconSize); ui->btnDelete->setIconSize(iconSize); ui->btnClear->setIconSize(iconSize); ui->btnSelect->setIcon(QIcon(pix1)); ui->btnDown->setIcon(QIcon(pix2)); ui->btnDelete->setIcon(QIcon(pix3)); ui->btnClear->setIcon(QIcon(pix4)); } void frmVideoPlayback::initData() { ui->listWidget->clear(); for (int i = 0; i < 10; i++) { QListWidgetItem *item = new QListWidgetItem(ui->listWidget); item->setText(QString("%1 - %2").arg(DATETIME).arg("7分53秒")); item->setCheckState(Qt::Checked); } } void frmVideoPlayback::initVideo() { videoMax = false; videoCount = 4; for (int i = 0; i < App::VideoCount; i++) { #ifdef videovlc VlcWidget *widget = new VlcWidget; widget->setCallback(true); //widget->setHardware("auto"); #elif videoffmpeg FFmpegWidget *widget = new FFmpegWidget; //widget->setHardware("d3d11va"); #elif easyplayer EasyPlayerWidget *widget = new EasyPlayerWidget; #else VideoWidget *widget = new VideoWidget; #endif //設置背景文字 widget->setBgText(QString("通道 %1").arg(i + 1)); //設置背景圖片 widget->setBgImage(QImage(":/bg_novideo.png")); //設置url地址 widget->setUrl(""); //設置懸浮條可見 widget->setFlowEnable(false); //設置是否自動重連 widget->setCheckLive(false); widget->installEventFilter(this); widget->setObjectName(QString("video%1").arg(i + 1)); widgets.append(widget); } //加入到佈局中 ui->gridLayout->addWidget(widgets.at(0), 0, 0); ui->gridLayout->addWidget(widgets.at(1), 0, 1); ui->gridLayout->addWidget(widgets.at(2), 1, 0); ui->gridLayout->addWidget(widgets.at(3), 1, 1); } void frmVideoPlayback::play_video_all() { //舉例數據 widgets.at(0)->setUrl("g:/mp5/1.asf"); widgets.at(1)->setUrl("g:/mp5/2.asf"); widgets.at(2)->setUrl("g:/mp5/3.asf"); widgets.at(3)->setUrl("g:/mp5/4.asf"); QTimer::singleShot(0, widgets.at(0), SLOT(open())); QTimer::singleShot(1000, widgets.at(1), SLOT(open())); QTimer::singleShot(2000, widgets.at(2), SLOT(open())); QTimer::singleShot(3000, widgets.at(3), SLOT(open())); VideoCh::VideoData data1, data2, data3, data4; data1.startX = 30; data1.length = 150; data2.startX = 200; data2.length = 50; data3.startX = 280; data3.length = 100; ui->videoPlayback->setDatas1(QList<VideoCh::VideoData>() << data1 << data2 << data3); data4.startX = 30; data4.length = 380; ui->videoPlayback->setDatas2(QList<VideoCh::VideoData>() << data4); ui->videoPlayback->setDatas3(QList<VideoCh::VideoData>() << data4); ui->videoPlayback->setDatas4(QList<VideoCh::VideoData>() << data4); } void frmVideoPlayback::show_video_all() { for (int i = 0; i < videoCount; i++) { widgets.at(i)->setVisible(true); } } void frmVideoPlayback::hide_video_all() { for (int i = 0; i < videoCount; i++) { widgets.at(i)->setVisible(false); } } void frmVideoPlayback::on_listWidget_itemPressed(QListWidgetItem *item) { bool checked = (item->checkState() == Qt::Checked); item->setCheckState(checked ? Qt::Unchecked : Qt::Checked); }