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 FullHDGuessed Channel Layout for Input Stream
Input
Metadata:
title : RTSP Session
Duration: N/A, start: 0.000000, bitrate: N/A
Stream
Stream
Output
Metadata:
title : RTSP Session
encoder : Lavf56.25.101
Stream
Stream
Metadata:
encoder : Lavc56.26.100 aac
Stream mapping:
Stream
Stream
, .
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 / defaultserver {
listen 80 default_server;
listen [::]:80 default_server;
access_log off;
error_log /dev/null;
root /tmp/www;
index index.html;
server_name _;
location / {
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