Video von der Überwachungskamera auf der Website kostenlos und ohne SMS

Es war notwendig, Videos von der Kamera auf der Website online zu zeigen. Ich habe mehrere Optionen gesehen (ich werde die Optionen aus den Kommentaren ergänzen, falls vorhanden):

  • Geben Sie Zugriff auf die Kamera. Nur den Zugriff auf die Kamera zu gewähren, lohnt sich aus Sicherheitsgründen nicht. Die Kamera legt sich bereits bei sehr geringer Belastung hin.
  • Kommerzieller Service. Wir geben ihnen Zugang zur Kamera und Geld, sie geben uns einen Link zum Posten auf der Website. Sie lösen das Problem der Kompatibilität von Kamera und Benutzerbrowser, der Kanalleistung und der Verfügbarkeit
  • In ihren Einrichtungen. Zwischen dem Benutzer und der Kamera befindet sich etwas, das für die Browserkompatibilität, Leistung und Zugänglichkeit verantwortlich ist. Wir lösen die Probleme selbst.

Wir werden diese Option unten betrachten. Weil " Flash gestorben " oder " Flash ist im Begriff zu sterben ", die Option, einen Flash-Player auf einer Site zu platzieren, wurde nicht in Betracht gezogen. Der schwierige Weg, Lösungen im Internet zu finden, hat nicht zu einer schlüsselfertigen Lösung geführt. Ich musste ein Fahrrad erfinden.

Weitere Erfindungen unter Katze.

Beschreibung des resultierenden Fahrrads im Detail:


  • CCTV-Kamera-Streams über das RTSP- Protokoll .
  • ffmpeg nimmt einen Videostream von der Kamera und erstellt ein Video zur Anzeige über das Video- Tag des HTML5-Standards .
  • nginx gibt erstellte Dateien an Benutzer weiter
  • Zeigen Sie das Video auf der Seite mit hls , genauer gesagt mit dieser Implementierung

Weitere Informationen zu Einstellungen


Auf jedem Stream von der Kamera müssen Sie ffmpeg ausführen , um rtsp in Dateien zu konvertieren , die hls verstehen wird .

ffmpeg und Stream mit Sound


/usr/bin/ffmpeg \
  -i  rtsp://<     ONVIF Device Manager>  \
  -ar 44100 \
  -acodec aac -ac 1 -strict -2 -crf 18 \
  -c:v copy -preset ultrafast \
  -flags -global_header \
  -fflags flush_packets -tune zerolatency \
-hls_time 1 -hls_list_size 3 -hls_wrap 4 -hls_flags delete_segments -start_number 0 \
  /tmp/www/index1.m3u8
ffmpeg schreibt beim Start 25 fps bei FullHD
Guessed Channel Layout for  Input Stream #0.1 : mono
Input #0, rtsp, from 'rtsp://192.168.X.X:554/user=admin_password=tlJwpbo6_channel=1_stream=0.sdp?':
  Metadata:
    title           : RTSP Session
  Duration: N/A, start: 0.000000, bitrate: N/A
    Stream #0:0: Video: h264 (Baseline), yuv420p, 1920x1080, 25 fps, 9 tbr, 90k tbn, 50 tbc
    Stream #0:1: Audio: pcm_alaw, 8000 Hz, 1 channels, s16, 64 kb/s
Output #0, hls, to '/tmp/www/index1.m3u8':
  Metadata:
    title           : RTSP Session
    encoder         : Lavf56.25.101
    Stream #0:0: Video: h264, yuv420p, 1920x1080, q=2-31, 25 fps, 9 tbr, 90k tbn, 25 tbc
    Stream #0:1: Audio: aac, 44100 Hz, mono, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc56.26.100 aac
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (pcm_alaw (native) -> aac (native))
, .
noname.

Wie es funktioniert:


Wir nehmen einen Stream ohne Transcodierung, erstellen Dateien und eine Liste für die Wiedergabe im Ordner / tmp / www / .

Nginx


Die Reduzierung der Standard - Paket für Debian - Datei standardmäßig an, zum Beispiel diese:

/ etc / nginx / sites-enabled / default
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        access_log off;
        error_log /dev/null;
        root /tmp/www;
        index index.html;
        server_name _;
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }
}

Beispielseite mit Video:

/tmp/www/index.html
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/hls.js/latest/hls.min.js"></script>
<video id="video"></video>
<script>
  if(Hls.isSupported()) {
    var video = document.getElementById('video');
    var hls = new Hls();
    hls.loadSource('/index1.m3u8');
    hls.attachMedia(video);
    hls.on(Hls.Events.MANIFEST_PARSED,function() {
      video.play();
  });
 }
</script>

Das Skript sollte lokal platziert werden, es hat keine externen Abhängigkeiten. Erfahren Sie mehr über die Einstellungen von hls .

Wie es funktioniert:


hls ist auf der Seite verbunden und spielt Dateien aus der Liste index1.m3u8 ab. Die Liste und die Dateien werden von ffmpeg aktualisiert.

Was ist passiert:


  • Es funktioniert;
  • Die größte Last ist ffmpeg auf einem Atom-Prozessor vor drei Jahren;
    • Auflösung der Kamera Full HD ohne Ton - 1%;
    • Auflösung der Full HD Kamera mit Ton - 5%;

  • Anzahl der Nginx-Prozesse - Überwachung nach Last und verfügbarem Kanal. Wir konnten die Belastung des Prozessors nicht sehen - es wird nicht viel benötigt, um einfach kleine Dateien hochzuladen.
  • Ein Server mit ffmpeg und nginx kann überall platziert werden, nicht unbedingt auf einem Hosting oder am Standort von Kameras.
  • Die Verzögerung des Streams hängt von der Anzahl der Dateien in der Liste und der Größe (in Sekunden) der Datei ab. Beispielsweise wirkt sich eine Verzögerung von 10 Sekunden nicht wirklich auf die Betrachtung des Bauprozesses eines Hochhauses aus.
  • Videodateien werden besser auf tmpfs platziert, sie sind klein und werden oft überschrieben.
  • Alle Dienstleistungen sollten in einem Container platziert werden. Alle Pakete sind Standard für FROM debian:jessie;
  • Aufgrund des Vorgangs stürzt ffmpeg manchmal ab. Sie müssen es überwachen und neu starten, wenn es abstürzt.

    Ausgabe oben aus Container:
    top - 11:05:20 up 6 days, 12:15,  0 users,  load average: 1.29, 1.09, 1.03
    Tasks:  17 total,   1 running,  16 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 38.8 us,  1.0 sy,  0.0 ni, 59.6 id,  0.0 wa,  0.0 hi,  0.5 si,  0.0 st
    KiB Mem:  16359132 total, 16027988 used,   331144 free,   782968 buffers
    KiB Swap:  6369276 total,     3776 used,  6365500 free. 12784916 cached Mem
    
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
      281 root      20   0  341040  29192  19632 S   4.7  0.2  10:08.39 ffmpeg
       16 root      20   0  315888  27944  18984 S   1.0  0.2   2:50.95 ffmpeg
        9 root      20   0   46916  15128   6408 S   0.3  0.1   0:58.04 supervisord
  • Sie können es auf Desktops und Mobilgeräten mit modernen Browsern ansehen.
  • In absehbarer Zeit wird kein Eingreifen erforderlich sein.

Referenzen:


» Implementierung von hls
» Demo von hls
» ffmpeg
» nginx
» Der erweiterte und erweiterte Text des Artikels in meinem Blog

Source: https://habr.com/ru/post/de401107/


All Articles