Die grundlegende Methode zur Verwendung von QT zur Realisierung von Videoüberwachung in Linux-Systemen

     Hallo allerseits, heute werde ich Ihnen hauptsächlich mitteilen, wie Sie QT verwenden, um die grundlegende Funktionsweise der Videoüberwachung zu realisieren.

Inhaltsverzeichnis

Erstens: Grundlegende Einführung in die Videoüberwachung

Zweitens: Experimentelles Flussdiagramm

Drittens: Server der Videoüberwachung

Viertens: Client-Implementierung der Videoüberwachung


 

Erstens: Grundlegende Einführung in die Videoüberwachung

      Übliche Videoüberwachung und Live-Videoübertragung verwenden RTMP- und RTSP-Streaming-Medienprotokolle.

     RTSP (Real-Time Stream Protocol) ist ein textbasiertes Multimedia-Wiedergabesteuerprotokoll, das gemeinsam von Real Networks und Netscape vorgeschlagen wurde. RTSP definiert das Streaming-Format, und die Streaming-Daten werden über RTP übertragen; RTSP hat sehr gute Echtzeiteffekte und eignet sich für Video-Chats, Videoüberwachung etc.

     RTMP (Real Time Message Protocol) wurde von Adobe vorgeschlagen, um die Probleme des Multiplexing (Multiplexing) und der Paketierung (Multiplexing) von Multimedia-Datenübertragungsströmen zu lösen.Seine Vorteile liegen in geringer Latenz, hoher Stabilität und Unterstützung aller Kameraformate.Der Browser kann das Flash Plug-in laden und direkt abspielen.

     Nachdem wir so viel oben gesagt haben, soll jeder die aktuellen populären Streaming-Medienprotokolle verstehen. Im Allgemeinen muss dieses Protokoll mit Servern wie Nginx-Server und ffmpeg-Tools verwendet werden. Natürlich können wir kein leistungsstarkes Tool wie ffmpeg schreiben, dieses leistungsstarke Tool ist sehr gut entwickelt und speziell für Audio- und Videoverarbeitungslösungen konzipiert.

      Wenn wir diese Methode nicht für die Videoüberwachung verwenden möchten, gibt es eine einfache Lösung, die in Qt verwendet werden kann? Die Antwort ist ja. Siehe Schema unten.

     In diesem Qt-Tutorial haben wir uns bereits in Kapitel 11 mit der Netzwerkprogrammierung beschäftigt. Nachdem ich nun die Netzwerkprogrammierung gelernt habe, verwende UDP oder TCP für die Übertragung und verwende Qt, um die Socket-Schnittstelle der abstrakten Schicht des TCP/IP-Protokolls für die Kommunikation zu kapseln. Dann können wir sie auch zum Versenden von Bilddaten verwenden. Auf diese Weise können wir Qt verwenden, um den Server und den Client zu schreiben. Tatsächlich verwenden sowohl das RTSP-Protokoll als auch das RTMP-Protokoll das TCP/IP-Protokoll, und UDP oder TCP wird in der Transportschicht verwendet, sodass die RTSP- und RTMP-Protokolle Protokolle höherer Ebene sind.

Zweitens: Experimentelles Flussdiagramm

      Flussdiagramm des Datenübertragungsprinzips.

 Die Aufgaben, die wir erledigen müssen, sind wie folgt.

(1) Der Server sammelt Daten von der Kamera.

(2) Verarbeitung der Videodaten und Übertragung an Socket zur Übertragung per TCP/UDP.

(3) Der Client erhält Videodaten.

Das Projektablaufdiagramm dieses Kapitels.

     Dieses Projekt verwendet eine OV5640-Kamera (5 Megapixel) Diesmal verwenden wir Qts QUdpSocket für die Übertragung, sodass mehrere Clients Bilddaten empfangen können, ohne sich zu verbinden. Der Server ist das I.MX6U-Entwicklungsboard von Zhengdian Atom, und der Client kann ein Computer oder ein anderes I.MX6U-Entwicklungsboard oder ein anderes ARM-Entwicklungsboard sein, auf dem Qt ausgeführt werden kann.

Drittens: Server der Videoüberwachung

     Die Serverprojektstruktur sieht wie folgt aus:

 Der Inhalt unter dem Projektordner wird erklärt und der Quellcode wird im Projekt mit detaillierten Hinweisen angezeigt. Unter dem Projekt video_server:

1. capture_thread.h Dies ist die Header-Datei des Kameraaufnahme-Threads. Die Kamera sammelt Daten und wir starten einen Thread, um sie zu erhalten.

2. capture_thread.cpp ist das Hauptprogramm des Kamerathreads. Andere Dateien sind Schnittstellendateien, die nicht eingeführt werden müssen. Der Inhalt von capture_thread.h ist wie folgt.

1 #ifndef CAPTURE_THREAD_H
2 #define CAPTURE_THREAD_H
3
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <stdio.h>
8 #include <unistd.h>
9 #include <string.h>
10 #include <pthread.h>
11 #ifdef linux
12 #include <linux/fb.h>
13 #include <sys/ioctl.h>
14 #include <sys/mman.h>
15 #include <linux/videodev2.h>
16 #include <linux/input.h>
17 #endif
18
19 #include <QThread>
20 #include <QDebug>
21 #include <QPushButton>
22 #include <QImage>
23 #include <QByteArray>
24 #include <QBuffer>
25 #include <QTime>
26 #include <QUdpSocket>
27
28 #define VIDEO_DEV "/dev/video1"
29 #define FB_DEV "/dev/fb0"
30 #define VIDEO_BUFFER_COUNT 3
31
32 struct buffer_info {
33 void *start;
34 unsigned int length;
35 };
36
37 class CaptureThread : public QThread
38 {
39 Q_OBJECT
40
41 signals:
42 /* 准备图片 */
43 void imageReady(QImage);
44 void sendImage(QImage);
45
46 private:
47 /* 线程开启 flag */
48 bool startFlag = false;
49
50 /* 开启广播 flag */
51 bool startBroadcast = false;
52
53 /* 本地显示 flag */
54 bool startLocalDisplay = false;
55 void run() override;
56
57 public:
58 CaptureThread(QObject *parent = nullptr) {
59 Q_UNUSED(parent);
60 }
61
62 public slots:
63 /* 设置线程 */
64 void setThreadStart(bool start) {
65 startFlag = start;
66 if (start) {
67 if (!this->isRunning())
68 this->start();
69 } else {
70 this->quit();
71 }
72 }
73
74 /* 设置广播 */
75 void setBroadcast(bool start) {
76 startBroadcast = start;
77 }
78
79 /* 设置本地显示 */
80 void setLocalDisplay(bool start) {
81 startLocalDisplay = start;
82 }
83 };
84
85 #endif // CAPTURE_THREAD_H

Analyse: Es ist ersichtlich, dass der Server einen Thread zum Sammeln von Daten geöffnet hat, sodass die Schnittstelle und die Datenlogik getrennt sind und die Schnittstelle nicht einfriert.

Viertens: Client-Implementierung der Videoüberwachung

Die Menge an Client-Code ist kleiner und muss nur Bilddaten empfangen und verarbeiten.

1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QUdpSocket>
6 #include <QLabel>
7
8 class MainWindow : public QMainWindow
9 {
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget *parent = nullptr);
14 ~MainWindow();
15
16 private:
17 /* 用于接收数据 */
18 QUdpSocket *udpSocket;
19
20 /* 显示接收的图像数据 */
21 QLabel *videoLabel;
22
23 void resizeEvent(QResizeEvent *event) override;
24
25 private slots:
26 /* 图像更新 */
27 void videoUpdate();
28 };
29 #endif // MAINWINDOW_H

Fünftens: Videoüberwachung umfassender Test

      Die Schnittstelle verwendet zwei QCheckBoxen, eine QCheckBox wird verwendet, um die lokale Bildanzeige zu öffnen, dh um den von der Kamera erfassten Inhalt anzuzeigen. Eine weitere QCheckBox dient zum Öffnen von UDP-Broadcast, also zum Versenden der von der Kamera erfassten Inhalte. Diese beiden Funktionen sind standardmäßig nicht ausgewählt, bitte klicken Sie unten auf der Benutzeroberfläche auf „Enable Camera Data Collection“, um Daten zu sammeln, und wählen Sie dann die Funktionen aus, die aktiviert werden müssen.

     Der Client kann auf einem anderen Entwicklungsboard oder Ubuntu/Windows ausgeführt werden, und mehrere Clients können gleichzeitig auf verschiedenen Computern ausgeführt werden. Stellen Sie sicher, dass es sich unter demselben Router (selbes LAN) wie der Server befindet. Die laufenden Ergebnisse sind wie folgt: Die Daten vom Server werden empfangen und das Bild wird angezeigt, das mit dem auf dem Server angezeigten Bild synchronisiert ist.Die Wirkung ist gut.

Zusammenfassung: Dieses Projekt kann z. B. auf die Außenüberwachung, die Überprüfung von Besuchern usw. angewendet werden, was der Überprüfung von Besuchern am Tor eines Terminals in einem intelligenten Gebäude sehr ähnlich ist. Entwickeln Sie sogar verwandte Projekte des Lesers in Verbindung mit anderen Beispielen.

Ich denke du magst

Origin blog.csdn.net/weixin_41114301/article/details/128749761
Empfohlen
Rangfolge