Broadcast RTSP an WEB. Umstellung auf HLS. Boxed Lösung

Die Aufgabe bestand darin, alle RTSP-Streams von einem Videorecorder (Netsurveillance) zu sammeln und mehreren Personen einen schnellen Zugriff auf den Videostream zu ermöglichen. Da kein Browser das RTSP-Protokoll unabhängig anzeigen kann, musste etwas gefunden werden, um diesen Stream in ein für WEB geeignetes Format zu konvertieren.



Ich werde sofort eine Reservierung vornehmen: Während des Betriebs dieser Lösung wurde die Möglichkeit entdeckt, ein Videoarchiv mit SAMBA freizugeben. Diese Gelegenheit schien mir persönlich sehr bequem zu sein, und ich beschloss, sie in diesem Zusammenhang umzusetzen. Natürlich kann jemand eine Frage haben: "Gibt es eine Leitung und warum wird alles andere benötigt?" - In unserem Fall erwies sich diese Lösung als zu teuer. Und sie zählen immer noch in Dollar . Also, was ist verfügbar:



  • Unternehmensnetzwerk basierend auf Mikrotik über ein reguläres VPN
  • Mehrere CCTVs, bestehend aus verschiedenen Kameras und einem Videorecorder
  • Linux-Computer mit bereitgestelltem SAMBA-AD-DC- und WEB-Server in der Zentrale


Lohnt es sich daran zu erinnern, dass das Ganze von RTSP auf HLS konvertiert wird? Ich installiere den Shinobi-Host unter Linux gemäß dieser Anweisung . Die Installation ist nicht kompliziert, Sie müssen nur git und einige Abhängigkeiten installieren und das Installationsskript ausführen. Technisch die gleiche Linie, nur kostenlos. Vielleicht genug zum ersten Mal. Die Schnittstelle scheint nur bequemer, sonst das gleiche. Öffnen Sie nach der Installation und dem Start localhost : 8080 / super, melden Sie sich als admin@shinobi.video mit dem Kennwort admin an und erstellen Sie einen Haupteintrag für die Zugriffsüberwachung.



Die Standardspeicheroptionen haben bei mir nicht funktioniert. Außerdem habe ich während des Betriebs lange nach diesen Einstellungen gesucht, aber die Dringlichkeit hat mich gezwungen, cron.js (sudo pm2 stop cron) einfach zu deaktivieren und Linux-Tools zum Bereinigen der Videoarchivverzeichnisse zu verwenden.



Bild



Anzahl der Tage, an denen Videos gespeichert werden sollen - Die Anzahl der Tage, an denen Videos gespeichert werden sollen.

Anzahl der Tage, an denen Ereignisse gespeichert werden sollen - Die Anzahl der Tage, an denen Ereignisse gespeichert werden sollen (Anmeldungen, Kennwortänderungen usw.).

Anzahl der Tage, an denen Protokolle geführt werden sollen - Die Anzahl der Tage, an denen Systemnachrichten aufbewahrt werden sollen: Fehler, Fehler, Initialisierung.



Alle diese Parameter werden für jeden Benutzer individuell eingestellt, sehr praktisch. Es gibt aber auch eine API. Mit seinen Mitteln können Sie alle Streams eines bestimmten Monitors abrufen (ein Monitor ist eine Reihe von Streams für die Übertragung) und jeden von ihnen separat als Online-Übertragung auf einer Webseite präsentieren. Zunächst müssen Sie der Überwachung Informationen zu Streams von Videoüberwachungskameras hinzufügen.



Bild



Bild



Bild



Modus - Sendemodus: Aufnahme - Aufnahme, Nur ansehen - nur anzeigen .

Name - Der Name des Videostreams

Speicherort - Der Archivspeicherort, wenn Sie Aufzeichnen im Modus eingestellt haben

Vollständiger URL-Pfad - Ein Link zum RTSP-Stream selbst. Für die Netzüberwachung ist dies normalerweise der Link: rtsp: // IP: 554 / user = USER & password = PASSWORD & channel = CHANNELNUMBER & stream = 1.sdp? Real_stream - rtp-caching = 100 Die



in Shinobi angezeigten Informationen zum Ressourcenverbrauch unterscheiden sich stark von dem von htop angezeigt . In der Weboberfläche sehe ich ständig halb vollen Speicher, aber die Prozessorlast stimmt übrigens ziemlich gut mit der Anzeige auf der Konsole überein.



Bild



Soweit bekannt, ist es auch möglich, die System-GPU zum Konvertieren des Streams zu verwenden. Da wir es jedoch nicht installiert hatten, gab es keine Möglichkeit, dies sicherzustellen. Alles geschieht über die CPU. Wir haben 17 Streams konvertiert, von denen 3 lokal aufgezeichnet wurden. Ich werde hier Informationen über unseren Prozessor geben:



lscpu
Architecture: x86_64

CPU op-mode(s): 32-bit, 64-bit

Byte Order: Little Endian

Address sizes: 36 bits physical, 48 bits virtual

CPU(s): 8

On-line CPU(s) list: 0-7

Thread(s) per core: 2

Core(s) per socket: 4

Socket(s): 1

NUMA node(s): 1

Vendor ID: GenuineIntel

CPU family: 6

Model: 30

Model name: Intel(R) Xeon(R) CPU X3440 @ 2.53GHz

Stepping: 5

CPU MHz: 1210.183

CPU max MHz: 2534,0000

CPU min MHz: 1200,0000

BogoMIPS: 5066.32

Virtualization: VT-x

L1d cache: 32K

L1i cache: 32K

L2 cache: 256K

L3 cache: 8192K

NUMA node0 CPU(s): 0-7








Wenn Sie nur eine Online-Sendung auf einer Webseite verbinden müssen, müssen Sie zuerst den API-Schlüssel dem Benutzer hinzufügen, an dessen Monitor wir interessiert sind. Eine vollständige API-Anleitung finden Sie auf der offiziellen Website der Anwendung. Platzieren Sie oben den Cursor auf der E-Mail des Benutzers, klicken Sie auf und wählen Sie das API-Element aus.



Bild



Der Hauptparameter für uns ist Zulässige IPs (zulässige IPs). Mein Zugriff ist nur für das lokale Netzwerk geöffnet. Wenn Sie jedoch Ihre Streams in das globale Internet streamen möchten, müssen Sie 0.0.0.0/0 angeben und den Shinobi-Port nach außen weiterleiten.



, Shinobi RTSP , -. . : , 100% -, - RJ-45. , IP : - . AHD . , , ( ) — , .


Informationen über Web-Streams können mit einer einfachen GET-Anforderung abgerufen werden. Das Ergebnis wird im JSON-Format abgerufen, das leicht in Daten konvertiert werden kann. Ein Beispiel für ein einfaches PHP-Skript:



<?php
 
$url = array(
    'host'          => '192.168.2.104',                      # ,    Shinobi
    'port'          => '8080',                               #  web- Shinobi
    'api'           => 'TyIp1yRhqPLnJmlDpMzAenWYqVW8vt', # API 
    'monitor'       => 'f2xnMN0VAv'                          # ID ,   
);
 
$link = file_get_contents("http://". $url['host'] .":". $url['port'] ."/". $url['api'] ."/monitor/". $url['monitor'] ."/");
 
foreach(json_decode($link) as $data) {
     
    $source['title'][]  = $data->name;
    $source['url'][]    = "http://". $url['host'] .":". $url['port'] . $data->streams[0];
    $source['width'][]  = $data->width;
    $source['height'][] = $data->height;
    $source['status'][] = $data->status;
 
}
 
print "<html>
 
    <head>
        <title> </title>
        <link rel='stylesheet' href='https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css' integrity='sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T' crossorigin='anonymous'>
        <link href='https://vjs.zencdn.net/7.2.3/video-js.css' rel='stylesheet'>
    </head>
    <body>
     
    <div class='container' style='padding: 30pt 0;'>
 
        <div class='row'>
        <div class='col-sm-12' style='margin: 10pt 0 10pt;'>  
 
            <div class='card'>
                <div class='card-body'>
 
                <form action='' method='POST'>
                  <select class='form-control form-control-lg' name='streamId' onchange='this.form.submit()'>
                    ";
 
for($i = 0; $i <= count($source['title']); $i++){
     
    if( $_POST['streamId'] == $i) {
        print "<option value=". $i ." selected>". $source['title'][$i] ."</option>";
    } else {
        print "<option value=". $i .">". $source['title'][$i] ."</option>";
    }
}
 
if( isset($_POST['streamId']) ) {
    $id = $_POST['streamId'];
} else {
    $id = 0;
}
 
print "         </select></form>
        </div>
      </div>
</div>
 
<div class='col-sm-12'>   
 
    <div class='card'>
        <div class='card-body'>
         <video id='hls-example' style='margin: 0 auto;' class='video-js vjs-default-skin' width='". $source['width'][$id] ."' height='". $source['height'][$id] ."' controls>
            <source type='application/x-mpegURL' src='". $source['url'][$id] ."'>
            </video>
         <!-- <p class='card-text'>This is another card with title and supporting text below. This card has some additional content to make it slightly taller overall.</p> -->
          <p class='card-text' style='text-align: center;'> <small class='text-muted'>  : ". $source['status'][$id] ."</small></p>
        </div>
      </div>
    </div>
 
</div>
 
 
    <script src='https://vjs.zencdn.net/ie8/ie8-version/videojs-ie8.min.js'></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/videojs-contrib-hls/5.14.1/videojs-contrib-hls.js'></script>
    <script src='https://vjs.zencdn.net/7.2.3/video.js'></script>
 
    <script>
    var player = videojs('hls-example');
    player.play();
    </script>
 
 
 
    </div>
         
    </body>
</html>";
 
?>
      
      





Für einige Kameras habe ich den Aufnahmemodus angegeben. In diesem Fall wird nicht nur der Stream konvertiert, sondern auch von RTSP auf die lokale Festplatte aufgezeichnet. Wenn in den Aufzeichnungsparametern die Standardeinstellung angegeben ist, wird die Aufzeichnung im Ordner ./Shinobi/videos/ [MinitorID] / [[CameraID] gespeichert . Für mich sind einige Ordner vom Hauptmonitor über das Netzwerk zugänglich und werden über ein Gruppenrichtlinienobjekt für eine bestimmte Gruppe als Netzwerklaufwerke bereitgestellt.



Bild



Warum wird das gemacht? Ein einfaches Merkmal der Logistik: Es kommt vor, dass ein großes Auto mit Waren beladen wird und in eine andere Stadt fährt, wo es vom Käufer entladen wird, der sagen kann, dass etwas fehlt. Und es kommt vor, dass sie in ihren Läden etwas nicht mehr zählen können. Daher wird für das Lager von einigen Kameras, die bereits im MP4-Format vorliegen, eine separate Aufzeichnung erstellt. Dies kann Tonnen von Nachbesprechungszeit sparen.



All Articles