Also habe ich mir heute die Raspberry Camera geholt und die Bilder funktionieren einwandfrei.
Ein Bild im JPEG-Format aufnehmen:
raspistill -o image.jpg
Nehmen Sie ein 5-Sekunden-Video im H.264- Format auf:
raspivid -o video.h264
Ich möchte keine zusätzliche Anwendung installieren, da ich HTML5 nutzen möchte, das sofort verfügbar ist. Da Chrome / Safari integrierte Decoder für H.264 hat, möchte ich nur meinen Browser auf die URL zeigen und den Stream sehen.
Wie kann ich das erreichen?
webcam
streaming-video
camera
Piotr Kula
quelle
quelle
Antworten:
Streaming mit HLS
Apples proprietäre Methode zum Streamen von Live-Videos. Es heißt HTTP Live Streaming (HLS) und wird nur von Apples Technologie unterstützt. Google (Chromium / YouTube) verwendet eine eigene Implementierung namens Dash MPEG, und alle anderen sind entweder verwirrt oder verwenden H.264, das in MP4 eingekapselt ist .
PROS
.m3u8
Wiedergabelisten unterstütztCONS
m3u8
.m3u8
ist einfach eine UTF-8- Version des M3U-Formats. (.m3u-Dateien können verschiedene Kodierungen haben.) Einige behaupten, dass das Umbenennen einer .m3u8 in .m3u in allen HTML5-Browsern erwartungsgemäß funktioniert. Ich habe es versucht und es hat bei mir nicht funktioniert.Das Konzept hinter diesem Streaming ist, dass kurze Segmente von Dateien, die mindestens 5 Sekunden lang sind (in diesem Beispiel - es gibt neue Möglichkeiten, dies zu beschleunigen), aufgezeichnet und in einer geeigneten Datei gespeichert werden. Die Wiedergabelistendatei wird mit dem neuen Dateinamen aktualisiert, und der Client ruft diese Wiedergabeliste immer ab und lädt die neueste Datei herunter. Es sind einige Mechanismen erforderlich, um das Video nahtlos auf dem Client zusammenzuführen. Aus diesem Grund möchten andere Entwickler dies nicht implementieren, da dies viel Aufwand erfordert und nicht den HTML5-Standards entspricht (obwohl es keinen richtigen HTML5-Standard für Live-Streams gibt? Ehh, seufz ).
Installieren
Sie müssen kompilieren
ffmpeg
- nichtapt-get install
für FFmpeg verwendenDies kann bis zu 5 Stunden dauern. Es muss Version 1.1 oder höher sein, die Segment-Streaming unterstützt. Sie können dies verwenden, um es zu klonen und zu kompilieren.
/usr/share/nginx/www/
Erstellen Sie eine Bash- Skriptdatei mit dem Namen
video.sh
, wenden Siechmod +x
sie an und fügen Sie sie ein. Ändern Sie den Basisordner in den Ordner, in dem sich Ihr HTTP- Server befindet. Ich habe benutztnginx
,/usr/share/nginx/www/
Erstellen Sie eine HTML-Datei, die die Wiedergabeliste lädt
Unterstützung
Referenz: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392
Originalcode: https://github.com/AndyA/psips/blob/master/examples/hls.sh
quelle
-segment_wrap 10
ffmpeg als Argument hinzufügen , werden maximal 10 Segmentdateien verwendet.segments/
wenn auf die Segmentdateien verwiesen wurde. Daher habe ich den Segmentordner gelöscht. Habe ich etwas falsch verstanden?UV4L MMAL
Vielen Dank an @mpromonet für das Update des Linux-Projects V4L2-Treibers, der MMAL jetzt sehr effizient implementiert - aber es ist noch in Arbeit.
Befolgen Sie diese Anweisungen, um das Linux-Projekt-Repository zu installieren und den UV4L-Treiber mit Extras zu installieren. Dann installieren Sie den Server und MJPEG. Wenn Sie möchten, können Sie auch mit den anderen experimentieren.
Nachdem Sie alles installiert haben, können Sie über Port 8080 auf den HTTP-Server zugreifen. Sie sollten auch die
/etc/uv4l/conf
Datei überprüfen und festlegen, ob Sie MJPEG oder H.264 verwenden möchten, da dies einen Unterschied macht. Sie können jedoch einige Einstellungen über das integrierte Web vornehmen Server.HTML 5
Darauf haben wir alle gewartet (genannt WebRTC ) und dank des neuen Treibers funktioniert es großartig (auf einem Raspberry Pi 2).
Führen Sie zunächst die folgenden Schritte aus: http://www.linux-projects.org/modules/sections/index.php?op=viewarticle&artid=14 .
Installieren Sie dann auf Ihrem Raspberry Pi 2 das WebRTC (für einen Raspberry Pi 1 lesen Sie die verlinkte Seite für weitere Optionen).
Starten Sie alle Treiber neu und gehen Sie zu
Sie haben jetzt Video-Streaming mit geringer Latenz und hoher Qualität direkt in einen modernen Browser wie Chrome oder Firefox. (Vielleicht Safari, aber ich kann es nicht überprüfen, weil sie keine Winblows mehr ausführen und Internet Explorer ... wie)
MJPEG
Standardmäßig wird
mjpeg
1080p verwendet und es ist sehr träge. Ich habe es auf 800x600 Frames angepasst und mit etwas wie iSpy Videos verarbeitet. Aus Sicherheitsgründen erhalte ich bei einem gestochen scharfen Video etwa 10 fps. Es ist viel besser als die 3 fps bei 640x480 vor diesem Treiber. Es funktioniert auf dem iPhone mit Safari, Android Chrome und fast allem anderen.http://raspberrypi:8080/stream/video.mjpeg
Dies bedeutet auch, dass
motion
(ich muss noch testen und vergleichen) jetzt viel besser funktionieren sollte. Stellen Sie sicher, dass die Konfiguration aufv4l2_palette 8
oder eingestellt istv4l2_palette 2
H.264
Dies wurde nun für "Streaming" behoben und wir müssen keine großen Anstrengungen unternehmen, um H.264-Videos über den VLC Media Player anzusehen . Der Stream ist noch RAW H.264, Sie müssen ihn also demuxen oder transcodieren / encapsualte, wenn Sie ihn woanders verwenden möchten. Sie sollten das
bitrate=xxxxxx
in der Konfigurationsdatei anpassen, wenn Sie über Wi-Fi streamen.In VLC Media Player müssen Sie angeben, dass Sie den H.264-Demuxer verwenden möchten. Wenn Sie also die GUI verwenden, müssen Sie das Argument hinzufügen
:demux=264
. Von der Kommandozeilevlc http.../video.h264 --demux h264
. Andernfalls wird nur ein leerer Bildschirm angezeigt, obwohl die Kamera-LED eingeschaltet ist.http://raspberrypi:8080/stream/video.h264
Voila! HD-Streaming mit ca. 500 ms Verzögerung (mit Optimierungen bis zu 200 ms). Es ist definitiv viel einfacher als mit den alten Methoden. Qualität und FPS sind hervorragend, aber Sie können dies nicht in HTML5 einbetten, ohne in MP4 oder WebM zu transkodieren . Ich hoffe, dass dies implementiert wird, da dies wirklich zu einem großartigen Standalone-Server wird.
RTSP / RTMP / RTP
Nicht unterstützt / implementierthttp://www.linux-projects.org/uv4l/tutorials/rtsp-server/
HLS
Nicht unterstützt / implementiert
Es ist noch keinvideo4linux
Treiber verfügbar. Dies bedeutet, dass wir ffserver nicht verwenden können, um Daten mit/dev/video0
einer USB-Webcam zu streamen .Aus diesem Grund ist es für HTML5-Browser so schwierig, ein geeignetes Live-Streaming zu finden.
Gstreamer
(nicht HTML5)<OBJECT ...
:) (verzögert) in eine Webseite einbetten.quelle
video4linux
den offiziellen V4L2-Treiber bcm2835-v4l2 und den Userspace V4L2-Treiber [ linux-projects.org/modules/sections/…--demux h264
Flagge anzeigen . Wir müssen dies noch umcodieren, um es auf Mobilgeräten zu verwenden oder um es als mp4 / webm auf Webseiten einzubetten. Aber es ist wirklich großartig, effizient und qualitativ voranzukommen. Nicht mit dem "anderen" UV4L-Treiber verwechseln, der kein Linux-Projekt ist./usr/bin/cvlc v4l2:///dev/video0 --v4l2-width 800 --v4l2-height 400 --v4l2-chroma h264 --sout '#standard{access=http,mux=ts,dst=0.0.0.0:8080}' :demux=264
Streaming mit MJPEG
U4VL
Eine Kernel-Schnittstelle mit einem eingebauten HTTP (S) -Server.
http://www.linux-projects.org/uv4l/tutorials/streaming-server/
Raspberry Pi Cam Weboberfläche
Ein schönes Projekt von silvanmelchior , das einen dvr-ähnlichen Web-Server mit mehreren Ziel-Streaming-Servern einsetzt. Benötigt weitere Informationen
https://github.com/silvanmelchior/RPi_Cam_Web_Interface
Legacy-Methode
Streaming mit mjpg wird von fast allen Browsern unterstützt, einschließlich Internet Explorer 6. Viele Kameras, die vor H.264 verwendet wurden, verwendeten Hardware-mjpg, wodurch JPEG-Dateien so schnell wie möglich in einen Ordner kopiert wurden, während mjpg die Datei in einen Puffer las und löschte Sie. Einige Geräte erreichen bis zu 25 fps und selbst wenn Sie eine schlechte Verbindung haben, erhalten Sie mindestens 1 fps.
Die Unterstützung für mjpg wurde bei HD-Kameras eingestellt, da die JPEG-Datei für das Streamen über das Internet einfach zu groß wurde und H.264 ein viel schnelleres und qualitativ besseres Protokoll ist.
Da wir mit dem Kameramodul nativ keine Möglichkeit haben, H.264 zu übertragen, scheint dies ein praktikabler Fallback zu sein ...
Es ist ziemlich augenblicklich, aber erwarten Sie nicht, mehr als 1,5 fps zu bekommen. Das ist
raspistill
extrem SLOOOW! Die auf 100 ms eingestellte Zeitrafferfunktion, die 10 fps ergeben sollte, funktioniert nicht, da sieraspistill
nur drosselt und schwerwiegende Leistungsprobleme mit sich bringt ./tmp
zur Verwendung RAM für Geschwindigkeit/etc/default/tmpfs
- VeränderungRAMTMP=yes
(Dies ist ein Versuch , fps zu erhöhen, aber raspistill kann einfach nicht mit seinem Selbst halten.)/usr/src
, mkdir mjpg-streamer, cd mjpg-streamer ...git clone https://github.com/engine12/mjpg-streamer.git
make USE_LIBV4L2=true clean all
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
mjpg_streamer
und ihre Pluginsinput_*.so
undoutput_*.so
nach/usr/local/bin
. Andernfalls führen Sie es direkt aus dem src-Verzeichnis aus.mkdir /tmp/stream
raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
LD_LIBRARY_PATH=./ ./mjpg_streamer -i "input_file.so -f /tmp/stream" -o "output_http.so -w ./www"
(Führen Sie dies dort aus, wo sich die Binärdateien und Plugins befinden.)http://<IP-address>:8080
Ich hatte 5 Stunden lang Mühe , es zu kompilieren ... seufz , aber ich denke, ich werde dies verwenden, da ich von jedem Telefon und jedem Browser aus auf den Stream zugreifen kann. Ich muss nur warten, bis wir bessere Fahrer bekommen ... Noch ein oder zwei Jahre. :(
Egal welche Qualität ich versuche, ich erhalte mit Stream nicht schneller oder nicht langsamer als 1 fps. Ich habe 720p und 1080p verwendet und nur die Bildqualität wird besser, aber fps macht im LAN keinen Unterschied. Ich nehme an, kleinere Einstellungen helfen bei WAN / 3G oder anderen Funkübertragungen.
raspistill schreibt das Bild in eine einzelne Datei. Dies könnte ein Engpass sein. Es schreibt die Datei, mjpg strreamer liest sie und löscht sie, wodurch eine blockierende E / A verursacht wird, sodass raspistill nicht in die Datei schreiben kann.
Das einzige, was ich mir vorstellen kann, ist die Verwendung von raspivid piped in FFmpeg , das JPEG-Dateien für uns erstellt. Ich muss dies versuchen und es ist möglicherweise viel schneller als die Verwendung von raspistill. Ich habe es geschafft, 25 fps bei einer schockierenden Qualität zu erreichen, und es hat sich um ungefähr 10 Sekunden verzögert ... Durch das Ändern der Einstellungen habe ich ungefähr 3 fps, aber 100% CPU. Es wird keine Hardware zum Verarbeiten des Videostreams verwendet ...
Ich habe auch gelesen und festgestellt, dass wir
%d
in der raspistill-Ausgabe den Dateinamen verwenden können. Ich frage mich, ob das die FPS steigern wird. Außerdem ist die JPG-Codierung in Raspistill hardwarebeschleunigt, sodass ich mich wirklich schwer tun kann, herauszufinden, warum sie so langsam ist ...Ich habe unglaubliche 2 FPS
%d
im Dateinamen. Aus irgendeinem Grund ist das Schreiben der JPEG-Datei von raspistill aus schrecklich langsam. Seufzer.quelle
Ab 2017 (oder vielleicht früher)
raspivid
ist dies nicht mehr die bevorzugte Methode, da die Pi-Entwickler empfehlen, stattdessen V4L2 zu verwenden.Diese Methode ermöglicht es Ihnen, H264 über RTP mit V4L2 anstatt mit RTP zu streamen
raspivid
. Ich habe festgestellt, dass diese Methode zu weniger Aussetzern führt und eine höhere Bitrate ermöglicht:Dieses Skript sendet Multicasts für das Video und kann auf einem anderen Computer im LAN mit einem Befehl wie dem folgenden angezeigt werden:
-sync ext
Bewirkt, dass das Video so schnell wie möglich abgespielt wird, sodass es in Echtzeit ausgeführt wird, im Gegensatz dazu, dass es mit einer festen Framerate und Verzögerung ausgeführt wird, wenn der Pi Frames schneller aufzeichnet. Es gibt immer noch einige Verzögerungen bei dieser Methode, aber nicht schlimmer als bei den anderenraspivid
Methoden.(Tipp: Wenn Sie an einen Router oder Switch angeschlossen sind, der IGMP unterstützt, vergewissern Sie
224.0.0.0/4
sich , dass auf Ihrem Computer keine Firewall installiert ist. Wenn der Router Ihren PC sonst fragt, ob Multicast-Datenverkehr gewünscht wird, antwortet der PC niemals und Sie werden es nie sehen irgendein Video.)Aufnahme auf Festplatte
Wie ich bereits in den Kommentaren erwähnt habe, werde ich hier darauf eingehen. Sie können einen Befehl wie diesen verwenden, um den Netzwerkstrom auf die Festplatte aufzuzeichnen:
Achten Sie auf
man strftime
die Bedeutung der%
Symbole im Dateinamen. In diesem Beispiel wird die Tagesnummer (0 = Sonntag, 1 = Montag usw.) gefolgt von einemT
und dann der Uhrzeit verwendet. Alle 15 Minuten wird eine neue Datei gestartet.Der Einfachheit halber soll dieser Aufzeichnungsbefehl auf einem Remote-PC (nicht auf dem Pi selbst) ausgeführt werden, obwohl er wahrscheinlich auch auf dem Pi funktioniert (ungetestet).
Da alle 15 Minuten eine neue Datei mit Tag und Uhrzeit im Dateinamen angezeigt wird, werden nach einer Woche bereits verwendete Dateinamen generiert, sodass die ältesten Dateien überschrieben werden. Mit anderen Worten, Sie erhalten eine Endlosschleife mit dem Filmmaterial der vergangenen Woche. Dies ist ideal für eine Überwachungskamera, bei der Sie selten länger als eine Woche zurückkehren müssen.
Als Randnotiz ist zu erwähnen, dass hierdurch Dateien im Wert von ca. 500 GB erstellt werden. Sie können daher die Bitrate anpassen, die Auflösung anpassen oder die Dateien früher überschreiben (etwa alle 24 Stunden), wenn Sie nicht möchten, dass sie so viel Speicherplatz beanspruchen.
quelle
ffserver
oder ein anderes Serversystem ändern , wenn mehr als ein Computer den Feed anzeigen soll. Nach möglicherweise 2-3 Clients (abhängig von der Videobitrate) hat der USB-Ethernet-Adapter des Pi keine Bandbreite mehr. Bei Multicast muss kein Server ausgeführt werden (Client-Computer wählen lediglich, ob der Datenverkehr abgehört oder ignoriert werden soll), sodass Tausende von Computern das Video ohne Auswirkung auf den Pi anzeigen können, der immer nur einen einzelnen Videostream sendet .Ich habe es geschafft, mit dem kompilierten Modul nginx-rtmp von meinem Raspberry Pi auf einen Webserver zu streamen .
Um Probleme zu vermeiden
ffmpeg
, empfehle ich eine rollende Distribution wie Arch Linux Arm .Einige Notizen:
Auf dieser Basis denke ich, dass Live-Streaming von einem Raspberry Pi für eine vorübergehende Übertragung in Ordnung sein könnte, aber nicht für eine immer eingeschaltete Webcam, da sie zu bandbreitenintensiv ist. Sie erhalten kein Audio, und wenn Sie dies tun, ist es eine Aufgabe, es zu synchronisieren.
Sie können Audio gleichzeitig mit der Videoaufnahme effizienter separat aufnehmen. Muxen Sie den Audio-Feed später, konvertieren Sie ihn in WebM und speichern Sie ihn als statische Datei mit einem HTML-Video-Tag auf Ihrem httpd. Der Workflow ist ziemlich umständlich, obwohl es das Beste ist, was ich mir für eine effiziente Übertragung vorstellen kann, die über alle Browser hinweg problemlos funktioniert.
quelle
UV4L unterstützt jetzt Live Audio & Video Streaming mit WebRTC und HTML5.
quelle
Die Antwort von Piotr Kula scheint auf dem richtigen Weg zu sein, ist aber für Raspberry Stretch veraltet.
Es gibt aktualisierte Anleitungen für uv4l auf Raspberry Stretch unter
https://www.linux-projects.org/uv4l/installation/
Sie können die uv4l-Optionen über /etc/uv4l/uv4l-raspicam.conf tweeken und dann den Dienst mit neu starten
In meinem Fall hat es nicht geklappt (wenn ich vergessen habe, den uv4l-Server zu installieren ...). Die folgenden Kommentare können Ihnen beim Debuggen ähnlicher Probleme helfen.
Ich habe überprüft, ob der Server läuft mit:
und ob es mit angehört hat
aber es gab keinen eintrag für uv4l in der liste. Ich hatte einen für Port 8080 erwartet
Also habe ich den Befehl aus Wie konfiguriere ich UV4L?
Der Server wurde aber trotzdem nicht automatisch gestartet ...
dann zeigte mir die Option
also habe ich versucht:
aber immer noch kein Server läuft auf Port 8080 oder anderswo. Also habe ich anscheinend die Option "--foreground" vergessen, die in der Manpage angegeben ist:
Das ist ein klarer Hinweis! Es scheint noch keinen Server zu geben - also installiere ihn:
und versuche es erneut:
Der Server ist jetzt unter http: // pi: 8080 verfügbar (ersetzen Sie pi durch die IP-Adresse oder den Hostnamen Ihres Servers).
Nach einem Neustart funktionierte es ohne Eingabe eines anderen Befehls.
quelle
UV4L unterstützt jetzt die Live- Übertragung von Audio und Video an Jitsi Meet Rooms über das Web. Es ist keine spezielle Konfiguration erforderlich. Es ist so einfach, wie Sie Ihren Namen, Ihr Zimmer und klicken Sie auf Start .
quelle
webkitRTCPeerConnection is not defined
Fehler. Normalerweise benutze ich IceWeasel für WebRTC, aber das wird für Jitsi nicht unterstützt.