Qt/C++ schreibt Videoüberwachungssystem mit 82 benutzerdefinierten Tonsäulenanzeigen

I. Einleitung

Die Amplitude des aktuell abgespielten Tons wird in Echtzeit über die Tonsäulensteuerung angezeigt. Dank der integrierten Berechnung der Audioamplitude in der Audiowiedergabekomponente kann dieser dynamisch ein- und ausgeschaltet werden. Nach dem Einschalten wird der Ton angezeigt Die zur Wiedergabe gesendeten Daten werden berechnet. Ermitteln Sie die Amplitude der aktuellen Audiodaten, ähnlich wie bei Dezibel. Je größer das Dezibel, desto lauter ist der Ton, den Sie hören, und desto größer ist die Amplitude. Zur Frage, wie die Tonsäulensteuerung platziert werden soll, haben wir verschiedene Lösungen in Betracht gezogen. Beispielsweise haben wir sie zunächst auf der rechten Seite der Videosteuerung platziert. Das heißt, wir haben zuerst eine Videosteuerung in einer vertikalen Anordnung platziert und dann Platzieren Sie die Sound-Spalte für den linken Kanal und schließlich eine Sound-Spalte für den rechten Kanal und legen Sie den Abstand zwischen den drei Steuerelementen fest. Später schlugen Benutzer vor, die Tonsäulensteuerung direkt über der Videosteuerung aufzuhängen. Dies kann Platz sparen und es der Videosteuerung ermöglichen, den größten Anzeigebereich anzustreben. Daher wurde sie kürzlich speziell neu gestaltet. Die Tonsäule kann darauf platziert werden links, rechts oder oben. , unten, seitlich, schwebend und in anderen Positionen, und dann können Sie auch die Größe der Klangsäule festlegen. Wenn sie vertikal platziert ist, ist die entsprechende Größe die Breite. Wenn sie oben und platziert ist Unten ist die entsprechende Größe die Höhe. Eine weitere Schwierigkeit ist der reine Audiokanal und die Lautstärke. Die Leiste muss in der mittleren Position platziert werden. Beispielsweise befinden sich auf der linken und rechten Seite der Lautstärkeleiste Federn. Die Größe von Der Lautstärkebalken ist ein Viertel der Breite, sodass er sehr schön aussieht.

Da die Videosteuerung auch über eine schwebende Leiste verfügt, muss die Position der Tonsäule genügend Platz lassen, damit die schwebende Leiste angezeigt werden kann. Die schwebende Leiste hat jedoch viele Positionen. Sie kann beispielsweise auch unten eingestellt werden, Daher muss es entsprechend der schwebenden Stange platziert werden. Position der Streifen und dann entsprechende Lücken lassen. Mit der Bequemlichkeit von Qt ist es sehr praktisch, ein solches Videoformular mit einem aufgehängten Videoband und einer Tonsäule zu entwerfen, und es unterstützt auch sehr flexible Parametereinstellungen. Erstellen Sie beispielsweise einfach ein neues frmVideoWidgetVolume-Videoformular mit einer Tonsäule. und die schwebende Leiste ist auch ein unabhängiges Widget, das sich je nach Größenänderung bewegt. Auf der Seite der Tonsäulensteuerung werden die entsprechenden Bedienelemente über das Tabellenlayout eingefügt. Wenn Sie beispielsweise Tonspalten auf beiden Seiten anzeigen müssen, fügen Sie zuerst die Tonspalte des linken Kanals, dann die Videosteuerung und schließlich die Tonspaltensteuerung des rechten Kanals ein. Die Schwierigkeit liegt in der Steuerung des reinen Audiokanals. Er muss automatisch entsprechend dem Größenverhältnis gedehnt werden, und ein Formular muss anhand der geöffneten Adresse unterscheiden, ob es sich um reines Audio handelt, sodass es nach Abschluss der Dekodierung beurteilt werden muss und endete. Mach Schluss.

2. Effektzeichnung

Fügen Sie hier eine Bildbeschreibung ein

3. Adresse erleben

  1. Inländische Website: https://gitee.com/feiyangqingyun
  2. Internationale Website: https://github.com/feiyangqingyun
  3. Persönliche Arbeit: https://blog.csdn.net/feiyangqingyun/article/details/97565652
  4. Erfahrungsadresse: https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g Extraktionscode: 01jf Dateiname: bin_video_system.

4. Verwandte Codes

#include "frmvideowidgetvolume.h"
#include "ui_frmvideowidgetvolume.h"
#include "qthelper.h"
#include "videowidgetx.h"
#include "barvolume.h"

frmVideoWidgetVolume::frmVideoWidgetVolume(int position, VideoWidget *videoWidget, QWidget *parent) : QWidget(parent), ui(new Ui::frmVideoWidgetVolume)
{
    
    
    ui->setupUi(this);

    this->position = position;
    this->videoWidget = videoWidget;
    bgText = videoWidget->getBgText();

    isVertical = true;
    if (position == 2 || position == 4) {
    
    
        isVertical = false;
    }

    //实例化音柱控件并设置方向
    leftVolume = new BarVolume;
    rightVolume = new BarVolume;
    leftVolume->setVertical(isVertical);
    rightVolume->setVertical(isVertical);

    //实例化布局并设置边距间距
    QGridLayout *layout = new QGridLayout(this);
    layout->setContentsMargins(0, 0, 0, 0);
    layout->setSpacing(3);

    //将音柱控件和视频控件插入到对应位置/可以自行拓展各种布局
    if (position == 1) {
    
    
        layout->addWidget(leftVolume, 0, 0);
        layout->addWidget(rightVolume, 0, 1);
        layout->addWidget(videoWidget, 0, 2);
    } else if (position == 2) {
    
    
        layout->addWidget(leftVolume, 0, 0);
        layout->addWidget(rightVolume, 1, 0);
        layout->addWidget(videoWidget, 2, 0);
    } else if (position == 3) {
    
    
        layout->addWidget(videoWidget, 0, 0);
        layout->addWidget(leftVolume, 0, 1);
        layout->addWidget(rightVolume, 0, 2);
    } else if (position == 4) {
    
    
        layout->addWidget(videoWidget, 0, 0);
        layout->addWidget(leftVolume, 1, 0);
        layout->addWidget(rightVolume, 2, 0);
    } else if (position == 5) {
    
    
        layout->addWidget(leftVolume, 0, 0);
        layout->addWidget(videoWidget, 0, 1);
        layout->addWidget(rightVolume, 0, 2);
    } else if (position == 6) {
    
    
        //实例化弹簧控件
        spaceLeft = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred);
        spaceCenter = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred);
        spaceRight = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Preferred);

        //实例化布局并插入控件
        hlayout = new QHBoxLayout;
        hlayout->addWidget(leftVolume);
        hlayout->addItem(spaceCenter);
        hlayout->addWidget(rightVolume);
        videoWidget->setLayout(hlayout);
        layout->addWidget(videoWidget);
    }

    //关联音频振幅信号
    connect(videoWidget, SIGNAL(sig_receiveLevel(qreal, qreal)), this, SLOT(receiveLevel(qreal, qreal)));
    //打开和关闭后需要清空下(有可能残留上一次的数据)
    connect(videoWidget, SIGNAL(sig_receivePlayStart(int)), this, SLOT(reset()));
    connect(videoWidget, SIGNAL(sig_receivePlayFinsh()), this, SLOT(reset()));
    //音柱窗体参数变化后需要重置
    connect(AppEvent::Instance(), SIGNAL(changeVolumeWidget()), this, SLOT(reset()));
}

frmVideoWidgetVolume::~frmVideoWidgetVolume()
{
    
    
    delete ui;
}

void frmVideoWidgetVolume::resizeEvent(QResizeEvent *)
{
    
    
    int width = this->width();
    int height = this->height();

    //根据宽度动态设置音量条宽度或者高度/也可以设置成固定值
    int size = (isVertical ? width : height);
    if (AppConfig::VolumeSize == 0) {
    
    
        size = size * 0.05;
        size = (size > 20 ? 20 : size);
    } else {
    
    
        size = AppConfig::VolumeSize;
    }

    if (isVertical) {
    
    
        leftVolume->setMaximumWidth(size);
        rightVolume->setMaximumWidth(size);
    } else {
    
    
        leftVolume->setMaximumHeight(size);
        rightVolume->setMaximumHeight(size);
    }

    //根据高度动态设置音量格子数量(一般高度越小格子数越少)
    int step = height / (position == 6 ? 10 : 6);
    leftVolume->setStep(step);
    rightVolume->setStep(step);

    //根据音柱位置摆放控件
    if (position == 6) {
    
    
        if (videoWidget->getIsRunning() && videoWidget->getVideoThread()->getIsOk()) {
    
    
            leftVolume->show();
            rightVolume->show();

            //根据悬浮条的位置留出空余的地方
            int offset = 35;
            if (AppConfig::BannerPosition == 1) {
    
    
                hlayout->setContentsMargins(9, 9, 9, offset);
            } else if (AppConfig::BannerPosition == 2) {
    
    
                hlayout->setContentsMargins(offset, 9, 9, 9);
            } else if (AppConfig::BannerPosition == 3) {
    
    
                hlayout->setContentsMargins(9, 9, offset, 9);
            } else {
    
    
                hlayout->setContentsMargins(9, offset, 9, 9);
            }

            //先把布局中的挨个移除
            hlayout->removeItem(spaceLeft);
            hlayout->removeItem(spaceCenter);
            hlayout->removeItem(spaceRight);
            hlayout->removeWidget(leftVolume);
            hlayout->removeWidget(rightVolume);

            //纯音频需要占用比较大的面积
            if (videoWidget->getOnlyAudio()) {
    
    
                videoWidget->setBgText("");
                size = width / 4;
                leftVolume->setMaximumWidth(size);
                rightVolume->setMaximumWidth(size);
                leftVolume->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored);
                rightVolume->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored);
                hlayout->addItem(spaceLeft);
                hlayout->addWidget(leftVolume);
                hlayout->addWidget(rightVolume);
                hlayout->addItem(spaceRight);
            } else {
    
    
                leftVolume->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
                rightVolume->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Ignored);
                hlayout->addWidget(leftVolume);
                hlayout->addItem(spaceCenter);
                hlayout->addWidget(rightVolume);
            }
        } else {
    
    
            leftVolume->hide();
            rightVolume->hide();
            videoWidget->setBgText(bgText);
        }
    }
}

void frmVideoWidgetVolume::reset()
{
    
    
    leftVolume->clear();
    rightVolume->clear();
    this->resizeEvent(NULL);
}

void frmVideoWidgetVolume::receiveLevel(qreal leftLevel, qreal rightLevel)
{
    
    
    leftVolume->setValue(leftLevel);
    rightVolume->setValue(rightLevel);
}

5. Funktionsmerkmale

5.1 Softwaremodule

  1. Videoüberwachungsmodul, verschiedene Docking-Untermodule in kleiner Form, einschließlich Geräteliste, grafische und textliche Alarminformationen, Fensterinformationen, PTZ-Steuerung, voreingestellte Position, Kreuzfahrteinstellungen, Gerätesteuerung, schwebende Karte, Surfen im Internet usw.
  2. Videowiedergabemodul, einschließlich lokaler Wiedergabe, Remote-Wiedergabe, Gerätewiedergabe, Bildwiedergabe, Video-Upload usw.
  3. Elektronisches Kartenmodul, einschließlich Bildkarte, Online-Karte, Offline-Karte, Routenplanung usw.
  4. Protokollabfragemodul, einschließlich lokaler Protokolle, Geräteprotokolle usw.
  5. Systemeinstellungsmodul, einschließlich Systemeinstellungen (Grundeinstellungen, Videoparameter, Datenbankeinstellungen, Kartenkonfiguration, Konfiguration der seriellen Schnittstelle usw.), Rekorderverwaltung, Kameraverwaltung, Abfragekonfiguration, Aufzeichnungsplan, Benutzerverwaltung usw.

5.2 Grundfunktionen

  1. Unterstützt verschiedene Videostreams (rtsp, rtmp, http usw.), Videodateien (mp4, rmvb, avi usw.) und lokale USB-Kamerawiedergabe.
  2. Unterstützt die Umschaltung mehrerer Bildschirme, einschließlich 1, 4, 6, 8, 9, 13, 16, 25, 36, 64 Bildschirmumschaltung.
  3. Unterstützt das Umschalten im Vollbildmodus. Mehrere Umschaltmethoden umfassen ein Rechtsklickmenü mit der Maus, Schaltflächen in der Symbolleiste und Tastenkombinationen (Alt+Eingabetaste zum Vollbildmodus, Esc zum Verlassen des Vollbildmodus).
  4. Unterstützt Videoabfragen, einschließlich 1-, 4-, 9- und 16-Bildschirmabfragen, und kann die Abfragegruppe (Abfrageplan), das Abfrageintervall, den Code-Stream-Typ usw. festlegen.
  5. Unterstützt das Onvif-Protokoll, einschließlich Gerätesuche, PTZ-Steuerung, voreingestellte Positionen, Gerätesteuerung (Bildparameter, Kalibrierungszeit, Systemneustart, Bilderfassung usw.).
  6. Unterstützt die Berechtigungsverwaltung. Verschiedene Benutzer können unterschiedlichen Modulberechtigungen entsprechen, z. B. Protokolle löschen, System herunterfahren usw.
  7. Die Datenbank unterstützt eine Vielzahl von Datenbanken, darunter SQLite, MySQL, SQLServer, PostgresSQL, Oracle, Renmin University of Finance and Economics usw.
  8. Die lokale USB-Kamera unterstützt Einstellungsparameter wie Auflösung und Bildrate.
  9. Alle Docking-Module generieren automatisch entsprechende Menüs zur Steuerung des Ein- und Ausblendens, die durch einen Rechtsklick auf die Titelleiste eingeblendet werden können.
  10. Unterstützt das Anzeigen aller Module, das Ausblenden aller Module, das Zurücksetzen des normalen Layouts und das Zurücksetzen des Vollbild-Layouts.
  11. Doppelklicken Sie auf das Gerät, um ein Echtzeit-Vorschauvideo anzuzeigen, das Bildkarten, Online-Karten, Offline-Karten usw. unterstützt.
  12. Ziehen Sie den Kameraknoten in das entsprechende Formular, um das Video abzuspielen, und unterstützen Sie das Ziehen lokaler Dateien für die direkte Wiedergabe.
  13. Das Löschen von Videos unterstützt mehrere Methoden, z. B. das Löschen mit der rechten Maustaste, das Schließen der schwebenden Leiste zum Löschen, das Ziehen aus dem Videoüberwachungsbereich usw.
  14. Die Geräteschaltflächen auf der Bildkarte können frei verschoben werden und Standortinformationen werden automatisch gespeichert. Auf der Baidu-Karte können Sie mit der Maus die Breiten- und Längengradinformationen abrufen, die zur Aktualisierung des Gerätestandorts verwendet werden können.
  15. Jeder Kanal im Videoüberwachungspanel-Formular unterstützt den Drag-and-Drop-Austausch mit sofortiger Reaktion.
  16. Es umfasst Baidu-Karten, Ansichtsumschaltung, Bewegungsbahn, Gerätestandort, Mausklick zum Abrufen von Breiten- und Längengraden usw.
  17. Vorgänge wie das Doppelklicken auf einen Knoten, das Ziehen eines Knotens und das Ziehen eines Fensters zum Vertauschen von Positionen aktualisieren und speichern automatisch die letzte Wiedergabeadresse, die beim nächsten Öffnen der Software automatisch angewendet wird.
  18. Die Steuerung der Lautstärkeleiste in der unteren rechten Ecke wird automatisch ausgeblendet, wenn sie den Fokus verliert, und die Lautstärkeleiste verfügt über ein Stummschaltsymbol.
  19. Unterstützt Video-Screenshots. Sie können einen einzelnen oder alle Kanäle angeben, um Screenshots zu erstellen. In der kleinen Symbolleiste unten gibt es auch eine Screenshot-Schaltfläche.
  20. Unterstützt das automatische Ausblenden des Mauszeigers im Laufe der Zeit und den automatischen Vollbildmechanismus.
  21. Unterstützt die Onvif-PTZ-Steuerung, mit der die PTZ-Kamera nach oben, unten, links und rechts bewegt werden kann, einschließlich Zurücksetzen und Fokuseinstellung.
  22. Unterstützt voreingestellte Onvif-Positionen. Sie können voreingestellte Positionen hinzufügen, löschen, ändern und die Startposition aufrufen.
  23. Unterstützt Onvif-Bildparametereinstellungen, einschließlich Helligkeit, Kontrast, Sättigung, Schärfe usw.
  24. Unterstützt andere Onvif-Vorgänge, einschließlich Screenshots, Netzwerkeinstellungen, Zeitanpassung, Neustart, Ereignisabonnement usw.
  25. Unterstützt jede OnVIF-Kamera, einschließlich, aber nicht beschränkt auf Hikvision, Dahua, Uniview, Tiandi Weiye, Huawei usw.
  26. Videos können gespeichert werden, es kann eine zeitgesteuerte Speicherung oder Einzeldateispeicherung ausgewählt werden und das Speicherintervall kann ausgewählt werden.
  27. Der Videostream-Kommunikationsmodus kann auf TCP+UDP eingestellt werden und die Videodekodierung kann auf Geschwindigkeitspriorität, Qualitätspriorität, Balance usw. eingestellt werden.
  28. Der chinesische Name, der englische Name, das Logo-Symbol usw. der Software können eingestellt werden.
  29. Gespeicherte Videodateien können in ein bestimmtes Verzeichnis exportiert und stapelweise auf den Server hochgeladen werden.
  30. Vollständige Aufnahmeplaneinstellungen, die jeden Kanal 7 * 24 Stunden lang unterstützen, um festzulegen, ob Aufnahmen jede halbe Stunde gespeichert werden sollen.

5.3 Funktionen

  1. Die Hauptschnittstelle verwendet den angedockten Formularmodus und verschiedene Komponenten werden in Form kleiner Module hinzugefügt. Jedes Modul kann angepasst und hinzugefügt werden.
  2. Das Dockingmodul kann zum Einbetten und Schweben an jede beliebige Position gezogen werden und unterstützt maximierten Vollbild- und Mehrfachbildschirm-Support.
  3. Der Dual-Layout-Dateispeichermechanismus, der Normalmodus und der Vollbildmodus, entsprechen unterschiedlichen Layoutschemata und werden automatisch umgeschaltet und gespeichert. Beispielsweise kann der Vollbildmodus mehrere Module hervorheben und sie an bestimmten Positionen transparent anzeigen, was moderner und wissenschaftlicher ist. fi.
  4. Der ursprüngliche Onvif-Protokollmechanismus verwendet eine zugrunde liegende Protokollanalyse (UDP-Broadcast-Suche + HTTP-Anforderungsausführungsbefehl), die leichter, leichter zu verstehen, leicht zu erlernen und zu erweitern ist und nicht auf Komponenten von Drittanbietern wie Gsoap angewiesen ist.
  5. Der ursprüngliche Mechanismus zum Importieren, Exportieren und Drucken von Daten ist plattformübergreifend und erfordert keine Komponenten, sodass Daten sofort exportiert werden.
  6. Durch die Integration mehrerer Originalkomponenten ist das Universum äußerst wertvoll und großartig, einschließlich Datenimport- und -exportkomponenten (Export in XLS, PDF, Drucken), Datenbankkomponenten (Datenbankverwaltungs-Thread, automatischer Datenbereinigungs-Thread, universelles Paging, Datenanforderung usw.) .), Kartenkomponenten, Videoüberwachungskomponenten, Datei-Multithread-Sende- und Empfangskomponenten, Onvif-Kommunikationskomponenten, allgemeine Browser-Kernelkomponenten usw.
  7. Benutzerdefiniertes Informationsfeld + Fehlerfeld + Abfragefeld + Eingabeaufforderungsfeld in der unteren rechten Ecke (einschließlich mehrerer Formate) usw.
  8. Exquisiter Skin-Wechsel, bis zu 17 Sätze von Skin-Stilen können nach Belieben geändert werden, alle Stile sind einheitlich, einschließlich Menüs usw.
  9. Der schwebenden Videosteuerungsleiste können mehrere Schaltflächen hinzugefügt werden, und auch der kleinen Symbolleiste am unteren Rand der Überwachungsoberfläche können Schaltflächen hinzugefügt werden.
  10. Doppelklicken Sie auf den Kameraknoten, um das Video automatisch abzuspielen. Doppelklicken Sie auf den Knoten, um automatisch Videos nacheinander hinzuzufügen und zum nächsten zu springen. Doppelklicken Sie auf den übergeordneten Knoten, um automatisch alle Videos unter dem Knoten hinzuzufügen. Optionaler Haupt-Stream und Sub-Stream.
  11. Die Verwaltung von Videorecordern und Kameras kann Druckinformationen hinzufügen, löschen, ändern, importieren und exportieren und sofort neue Geräteinformationen anwenden, um eine Baumliste ohne Neustart zu erstellen.
  12. Es können verschiedene Kerne frei umgeschaltet werden, z. B. ffmpeg, vlc, mpv usw., die alle in Pro eingestellt werden können. Es wird empfohlen, ffmpeg zu verwenden, das am plattformübergreifendsten ist und standardmäßig kompilierte Bibliotheken für Linux- und Mac-Plattformen bereitstellt.
  13. Unterstützt harte Dekodierung und kann den harten Dekodierungstyp festlegen (qsv, dxva2, d3d11va usw.).
  14. Standardmäßig wird OpenGL zum Zeichnen von Videos verwendet, was extrem niedrige CPU-Ressourcen verbraucht. Es unterstützt das Zeichnen in zwei Formaten, yuyv und nv12, und bietet eine explosive Leistung.
  15. Beschriftungen und Grafikinformationen unterstützen drei Zeichenmethoden: Zeichnen auf Maskenebene, Zeichnen auf Bild und Quellzeichnung (entsprechende Informationen können in einer Datei gespeichert werden).
  16. Es ist hochgradig anpassbar und Benutzer können auf dieser Basis problemlos ihre eigenen Funktionen ableiten, z. B. das Hinzufügen benutzerdefinierter Module, das Hinzufügen von Betriebsmodi, Roboterüberwachung, Drohnenüberwachung, Baggerüberwachung usw.
  17. Unterstützt XP, Win7, Win10, Win11, Linux, Mac, verschiedene inländische Systeme (UOS, Winning Kirin, Galaxy Kirin usw.), eingebettetes Linux und andere Systeme.
  18. Die Kommentare sind vollständig, die Projektstruktur ist klar, das sehr detaillierte und vollständige Entwicklungshandbuch entspricht genau der Funktionsbeschreibung jeder Codedatei und die Version wird kontinuierlich iteriert.

Supongo que te gusta

Origin blog.csdn.net/feiyangqingyun/article/details/135355456
Recomendado
Clasificación