Wie kann ich H.264-Videos vom Raspberry Pi-Kameramodul über einen Webserver streamen?


50

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?


2
Daran arbeite ich auch. Ich denke, Sie müssen MP4-Unterstützung zu Nginx oder so etwas hinzufügen. Lass es dich wissen, wenn ich einen Durchbruch habe.
Recantha

@recantha Hattest du neue Durchbrüche beim Streamen von Videos?
Piotr Kula

3
Die beste Lösung, die ich gefunden habe, basiert auf RaspiMJPEG von Silvan Melchoir. Schauen Sie sich meinen Blog an, der einen Link zum Forum der Raspberry Pi Foundation enthält, der alles erklärt. ( recantha.co.uk/blog/?p=11176 )
recantha

2
Ja, das sieht toll aus, um auf verschiedene Geräte streamen zu können. Welche FPS und Verzögerung bekommen Sie? Ich habe es geschafft, dass uv4l ziemlich gut mit VLC und OSD funktioniert. Eine sehr kurze und schlechte Demo. Wird bald eine bessere machen. Wurde spät in der Nacht nach stundenlangem Ausprobieren gemacht. youtu.be/LO10Ytlauag
Piotr Kula

@ppumkin Wie kann ich über ein Python-Skript aufnehmen, während RaspiMJPEG ausgeführt wird? Es gibt einen Start für die Videoaufnahme, aber es zeichnet im .h264-Format auf. Wie kann ein Python-Skript beim Drücken von start_recording ausgeführt werden?
Coderaemon

Antworten:


32

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

  • Kann HD 1080p im LAN auf jedes Gerät streamen , das .m3u8Wiedergabelisten unterstützt
  • Verwendet HTML5-Semantik (aber kein standardisiertes Format)
  • Es kann Unterstützung für Premium-Software von Drittanbietern wie jwplayer 6 verwendet werden

CONS

  • Hat eine Verzögerung von mindestens 5 Sekunden (in dieser Anwendung, aber durch Spiegeln von iPhone auf AppleTv erreichen sie irgendwie 50 ms - 500 ms). Daher ist es nicht gut für ferngesteuerte Anwendungen, bei denen sofortige Reaktionen erforderlich sind, z. B. Roboter oder Hubschrauber.
  • Sie müssen für Software von Drittanbietern zahlen, wenn Sie eine breitere Browserunterstützung wünschen, die möglicherweise flashen kann.

m3u8

  • .m3u8ist 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- nicht apt-get installfür FFmpeg verwenden

Dies 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.

cd /usr/src
git clone git://source.ffmpeg.org/ffmpeg.git

cd ffmpeg
./configure
make && make install
  • Installieren Sie nginx (engine-x) - nginx wurde speziell für eingebettete Geräte entwickelt und ist der derzeit leichteste und schnellste PHP- fähige Webserver. (Ja, es ist besser als sperriger Apache )
  • Erstellen Sie ein Verzeichnis, zum Beispiel live in Ihrem WWW-Ordner, /usr/share/nginx/www/

Erstellen Sie eine Bash- Skriptdatei mit dem Namen video.sh, wenden Sie chmod +xsie an und fügen Sie sie ein. Ändern Sie den Basisordner in den Ordner, in dem sich Ihr HTTP- Server befindet. Ich habe benutzt nginx,/usr/share/nginx/www/

#!/bin/bash

base="/data/live"

cd $base

raspivid -n -w 720 -h 405 -fps 25 -vf -t 86400000 -b 1800000 -ih -o - \
| ffmpeg -y \
    -i - \
    -c:v copy \
    -map 0:0 \
    -f ssegment \
    -segment_time 4 \
    -segment_format mpegts \
    -segment_list "$base/stream.m3u8" \
    -segment_list_size 720 \
    -segment_list_flags live \
    -segment_list_type m3u8 \
    "segments/%08d.ts"


trap "rm stream.m3u8 segments/*.ts" EXIT

# vim:ts=2:sw=2:sts=2:et:ft=sh

Erstellen Sie eine HTML-Datei, die die Wiedergabeliste lädt

<html>
  <head>
    <title>PiVid</title>
  </head>
  <body>
    <video controls="controls" width="1280" height="720" autoplay="autoplay" >
      <source src="stream.m3u8" type="application/x-mpegURL" />
    </video>
  </body>
</html>

Unterstützung

  • iPhone, öffnet die Seite, wechselt jedoch in QuickTime . Die Qualität ist wirklich unglaublich!
  • Windows Safari, Streams in Ordnung.
  • Macintosh oder Windows, QuickTime. Streams gut.
  • Android 2.3.5 und funktionierte nicht, sollte aber seit 2.1.x unterstützt werden
  • Windows, Chrome - Nichts
  • Windows, Internet Explorer 10 --- Nichts (nicht unterstützter Videotyp)
  • Windows, VLC Media Player - Nichts

Referenz: http://www.raspberrypi.org/phpBB3/viewtopic.php?p=351392&sid=5b9a46f5eea2c7a0887d2efdfa7edade#p351392

Originalcode: https://github.com/AndyA/psips/blob/master/examples/hls.sh


In Bezug auf die Beschleunigung der Kompilierung von ffmpeg Um die geringe Rechenkapazität von RPI und die langen Kompilierungszeiten für ffmpeg zu umgehen, habe ich versucht, Qemu mit dem Wheeze zu verwenden , bin aber beim Anmelden auf ein Hindernis gestoßen und musste es mit einem Arch-Image versuchen . Das hat funktioniert. Auch versucht Sqeeze auf einem Ubuntu Bild , durch VirtualBo
luboP

2
Gibt es eine Möglichkeit, alte Segmente automatisch zu löschen? Die SD-Karte ist nach einiger Zeit voll. Ich möchte auch, dass sie gelöscht werden, um dies auf einem tmpfs auszuführen und die SD-Karte nicht zu ruinieren.
Dimme

2
@Dimmme Wenn Sie -segment_wrap 10ffmpeg als Argument hinzufügen , werden maximal 10 Segmentdateien verwendet.
Gregers

Hat jemand das zum Laufen gebracht? Die Dateien wurden erstellt, scheinen jedoch keine SPS / PPS-Informationen zu enthalten, sodass das Video in iOS Safari oder VLC nicht abgespielt werden kann. Die Datei stream.m3u8 enthielt auch keine Informationen, segments/wenn auf die Segmentdateien verwiesen wurde. Daher habe ich den Segmentordner gelöscht. Habe ich etwas falsch verstanden?
Gregers

Sie müssen den Stream durch die PSIPS-Filter-Binärdatei leiten. Die neueste Version von Raspicam sollte dies tun. Aber aus irgendeinem Grund könnte ich es nicht zum Laufen bringen ohne PSIPS
Piotr Kula

23

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/confDatei ü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 .

curl http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc | sudo apt-key add -

# Add the following line to the file /etc/apt/sources.list
# deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

sudo apt-get install uv4l-raspicam-extras

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).

sudo apt-get install uv4l-webrtc

Starten Sie alle Treiber neu und gehen Sie zu

http://raspberry:8080/

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 mjpeg1080p 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 auf v4l2_palette 8oder 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=xxxxxxin 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 Kommandozeile vlc 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 / implementiert

http://www.linux-projects.org/uv4l/tutorials/rtsp-server/

HLS

Nicht unterstützt / implementiert


Es ist noch kein video4linuxTreiber verfügbar. Dies bedeutet, dass wir ffserver nicht verwenden können, um Daten mit /dev/video0einer USB-Webcam zu streamen .

Aus diesem Grund ist es für HTML5-Browser so schwierig, ein geeignetes Live-Streaming zu finden.


Jetzt gibt es video4linuxden offiziellen V4L2-Treiber bcm2835-v4l2 und den Userspace V4L2-Treiber [ linux-projects.org/modules/sections/…
mpromonet

Ist ein echter v4l-Treiber oder ist es nur der Wrapper Around Raspivid, der fürchterliche Leistung bringt?
Piotr Kula

1
Der offizielle Treiber verwendet die MMAL-Schnittstelle, siehe Quellcode [ github.com/raspberrypi/linux/blob/rpi-3.12.y/drivers/media/… . Die Leistung scheint korrekt zu sein.
mpromonet

Ich spiele jetzt seit 3 ​​Tagen damit. Die mjpeg-Kodierung ist definitiv viel stabiler und kann 800x600 @ 10fps auf iPhone, Android oder iSpy zuverlässig anzeigen. h264 ist großartig bei 1080p 30fps und wir können dies in VLC mit der --demux h264Flagge 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.
Piotr Kula

Beachten Sie, dass das Hinzufügen von: demux = 264 in der H264-Methode für den vlc-server und nicht für den vlc-client gilt. Die Befehlszeile zum Starten des Streamings auf der Himbeere, um die Kompatibilität mit VLC in Smartphones zu gewährleisten, lautet also:/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
Jaime M.

10

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 raspistillextrem SLOOOW! Die auf 100 ms eingestellte Zeitrafferfunktion, die 10 fps ergeben sollte, funktioniert nicht, da sie raspistillnur drosselt und schwerwiegende Leistungsprobleme mit sich bringt .

  1. Wechsel /tmpzur Verwendung RAM für Geschwindigkeit /etc/default/tmpfs- Veränderung RAMTMP=yes(Dies ist ein Versuch , fps zu erhöhen, aber raspistill kann einfach nicht mit seinem Selbst halten.)
  2. Starten Sie neu
  3. apt-get install git
  4. apt-get installiere libjpeg8-dev
  5. apt-get installiere libv4l-dev
  6. apt-get install imagemagick
  7. cd /usr/src, mkdir mjpg-streamer, cd mjpg-streamer ...
  8. git clone https://github.com/engine12/mjpg-streamer.git
  9. make USE_LIBV4L2=true clean all
  10. OPTIONAL Wenn Sie Fehler haben
  11. sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h
  12. sudo ln -s /usr/include/lib4l2.h /usr/include/linux/lib4l2.h
  13. Kommentieren Sie im Makefile alle Plugins mit Ausnahme von input_file und output_http aus und wiederholen Sie make. Ich hatte hier viele Probleme.
  14. Kopieren Sie die Binärdatei mjpg_streamerund ihre Plugins input_*.sound output_*.sonach /usr/local/bin. Andernfalls führen Sie es direkt aus dem src-Verzeichnis aus.
  15. Optionales Ende
  16. mkdir /tmp/stream
  17. raspistill -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
  18. 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.)
  19. Gehe zu http://<IP-address>:8080
  20. Hier sind ein paar Optionen, genießen Sie das "Live" -Streaming auf altmodische Weise ... unterstützt von den meisten Browsern - modern, alt und experimentell.

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 ...

raspivid -w 640 -h 480 -fps 25 -vf -t 86400000 -b 1800000 -o -  \
ffmpeg -i - \
    -f image2(?) \
    -c:v mjpeg \
    stream%d.jpg

Ich habe auch gelesen und festgestellt, dass wir %din 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 %dim Dateinamen. Aus irgendeinem Grund ist das Schreiben der JPEG-Datei von raspistill aus schrecklich langsam. Seufzer.


Vielen Dank für das Teilen des Wissens
user566245

10

Ab 2017 (oder vielleicht früher) raspividist 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:

#!/bin/sh

# Use V4L2 (preferred) instead of raspivid
# exposure_dynamic_framerate=1 (raspivid --fps 0) - reduce framerate/increase exposure in low light
# scene_mode=8 (raspivid --exposure night) - allow framerate reduction to increase exposure
v4l2-ctl -v width=1296,height=972,pixelformat=H264 \
        --set-ctrl=exposure_dynamic_framerate=1 \
        --set-ctrl=video_bitrate=5000000 \
        --set-ctrl=scene_mode=8

exec ffmpeg -f h264 -probesize 32 -r 30 -i /dev/video0 -vcodec copy -an -f rtp_mpegts udp://224.0.1.2:5004

Dieses Skript sendet Multicasts für das Video und kann auf einem anderen Computer im LAN mit einem Befehl wie dem folgenden angezeigt werden:

ffplay -sync ext -an -fast -framedrop -probesize 32 -window_title "Raspberry Pi" -an udp://224.0.1.2:5004

-sync extBewirkt, 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 anderen raspividMethoden.

(Tipp: Wenn Sie an einen Router oder Switch angeschlossen sind, der IGMP unterstützt, vergewissern Sie 224.0.0.0/4sich , 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:

ffmpeg -y -i udp://224.0.1.2:5004 -c copy \
  -f segment -segment_atclocktime 1 -segment_time 900 \
  -reset_timestamps 1
  -strftime 1 /path/to/storage/pi-%wT%H%M.mkv

Achten Sie auf man strftimedie Bedeutung der %Symbole im Dateinamen. In diesem Beispiel wird die Tagesnummer (0 = Sonntag, 1 = Montag usw.) gefolgt von einem Tund 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.


Cool - Danke, dass du das geteilt hast. Können Sie erklären, warum hier Multicast erforderlich ist? Aus dem, was ich gelernt habe, ist, dass Multicast selten verwendet wird - also habe ich mich gefragt, was es hier auf den Tisch bringt? Trotzdem - Das Skript sieht großartig aus und ich bin mir sicher, dass es vielen Leuten helfen wird. Danke +1
Piotr Kula

1
Multicast ist optional - Sie können einfach eine normale IP-Adresse ersetzen, wenn Sie dies wünschen. Sie müssen jedoch den zu verwendenden Befehl ffserveroder 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 .
Malvineous

Danke fürs Erklären - Aber Multicast funktioniert nur in internen Netzwerken? Wenn ein ISP ein Multicast-Paket erhält, wird es normalerweise einfach gestrippt. Sie können also nicht einfach an alle im Internet senden. Ich nehme an, wenn Sie ein großes internes Netzwerk haben, kann das Multicasting eines massiven Streams auch Auswirkungen auf Ihr Netzwerk haben. Aber ja ... nur für mich, um einen Stream anzusehen, würde ich nur zu einer ausgewählten IP UDP. Aber ich mag die Multicast-Option trotzdem: D Ich werde versuchen, es an diesem Wochenende zu tun, nur weil ich es noch nie zuvor getan habe. :) Danke
Piotr Kula

1
Ja, Multicast ist hauptsächlich für interne Netzwerke. Es soll mit IPv6 besser funktionieren, aber ich denke, es wird noch die Zusammenarbeit des ISP erforderlich sein. Ich verwende es, weil es bedeutet, dass ich keinen Server auf dem Pi ausführen muss und die Streams von zwei verschiedenen Computern anzeigen und auf Festplatte aufzeichnen kann, ohne die Konfiguration des Pi zu ändern oder die Netzwerkbandbreite des Pi zu überlasten. Wenn Ihr internes Netzwerk groß ist, werden Sie wahrscheinlich IGMP-fähige Switches verwenden, die nur Multicast-Verkehr senden, wenn dies erforderlich ist, um die Auswirkungen nicht anders als normal zu gestalten.
Malvineous

1
Vielen Dank für die Erklärung. Ich kann jetzt viele Vorteile der Verwendung von Multicast mit geringfügigen Einschränkungen erkennen, die sich nicht einmal auf Heimanwender auswirken werden. Ich werde es auf jeden Fall versuchen. Es sind die einfachen und offensichtlichen Dinge, auf die manchmal hingewiesen werden muss, um einen Sinn zu ergeben. Und wenn Sie sich Ihr Update ansehen ... das Aufnahmebit ist wirklich sehr, sehr cool!
Piotr Kula

4

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 .

raspivid -vf -t 0 -fps 25 -b 2000000 -o - |
ffmpeg -i - -vcodec copy -an -r 25 -f flv rtmp://x220/myapp/mystream

Einige Notizen:

  • Der hardwarecodierte H.264-Videostream benötigt eine Bandbreite von ca. 300 KB / s. Wenn ich meine Berechnungen richtig durchgeführt habe, werden mindestens 750 GB pro Monat benötigt, wenn Sie einen Stream an Ihren nginx-rtmp-httpd oder einen RTMP- Dienst wie diesen senden möchten ustream .
  • Audio: Wenn Sie möchten, dass Audio Ihren H.264-Stream begleitet, benötigen Sie es in AAC . Grundsätzlich ist der Raspberry Pi zu langsam, um ein USB-Mikrofon im laufenden Betrieb in AAC zu codieren .

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.


1
Sie können jedoch die Bandbreite und Auflösung steuern. Wenn sein lokales LAN Streaming für CCTV verwendet, ist das nicht einmal ein Problem. Die Übertragung über das Internet muss möglicherweise auf Abruf und / oder mit einer viel niedrigeren Auflösung erfolgen. Aber es ist eine andere Art, es zu tun. Danke +1
Piotr Kula

und wie soll es funktionieren? FFMPEG sagt "RTMP_Connect0, Socket konnte nicht verbunden werden. 111 (Verbindung abgelehnt)"
Flash Thunder


2

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/

# switch to superuser mode
sudo -s
# add the repository key for uv4l
curl http://www.linux-projects.org/listing/uv4l_repo/lpkey.asc | sudo apt-key add 
# add the url for the u4vl repository to apt
echo "deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/stretch stretch main" >> /etc/apt/sources.list
apt-get update
apt-get install uv4l uv4l-raspicam
apt-get install uv4l-raspicam-extras
# do not forget to install the server - see what happens if you do
# below
apt-get install uv4l-server
reboot

Sie können die uv4l-Optionen über /etc/uv4l/uv4l-raspicam.conf tweeken und dann den Dienst mit neu starten

sudo service uv4l_raspicam restart

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:

pgrep -fla uv4l
995 /usr/bin/uv4l -f -k --sched-fifo --mem-lock --config-file=/etc/uv4l/uv4l-raspicam.conf --driver raspicam --driver-config-file=/etc/uv4l/uv4l-raspicam.conf --server-option=--editable-config-file=/etc/uv4l/uv4l-raspicam.conf

und ob es mit angehört hat

sudo netstat -tulpn 

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?

uv4l --sched-rr --mem-lock --driver raspicam \
> --width 960 --height 540 --framerate 30 \
> --encoding mjpeg --vflip --hflip
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 960x544, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

Der Server wurde aber trotzdem nicht automatisch gestartet ...

man uv4l

dann zeigte mir die Option

--enable-server [=arg(=required)] (=auto)
          enable the streaming server. Possible values are: 'auto' (tenta‐
          tively start the server), 'required' (exit if failing  to  start
          the  server,  only  works if --foreground is enabled), 'off' (no
          server at all).

also habe ich versucht:

pkill uv4l
sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Registering device node /dev/uv4l

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:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<warning> [core] libserver.so: cannot open shared object file: No such file or directory
<alert> [core] No Streaming Server detected

Das ist ein klarer Hinweis! Es scheint noch keinen Server zu geben - also installiere ihn:

sudo apt-get install uv4l-server

und versuche es erneut:

sudo uv4l --sched-rr --mem-lock --driver raspicam --encoding mjpeg --enable-server=required --foreground
<notice> [core] Trying to loading driver 'raspicam' from built-in drivers...
<notice> [core] Loading driver 'raspicam' from external plug-in's...
<notice> [driver] Dual Raspicam & TC358743 Video4Linux2 Driver v1.9.63 built Oct  6 2018
<notice> [driver] Detected camera imx219, 3280x2464
<notice> [driver] Selected format: 1920x1080, encoding: mjpeg, JPEG Video Capture
<notice> [driver] Framerate max. 30 fps
<notice> [core] Device detected!
<notice> [core] Trying to load the the Streaming Server plug-in...
<notice> [server] HTTP/HTTPS Streaming & WebRTC Signalling Server v1.1.125 built on Mar  9 2019
<warning> [server] SSL is not enabled for the Streaming Server. Using unsecure HTTP.
<notice> [core] Streaming Server loaded!
<notice> [core] Registering device node /dev/uv4l
<notice> [server] Web Streaming Server listening on port 8080

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.


1

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 .


Welchen Browser verwenden Sie? Jitsi unterstützt nur Chrome, Chromium, Opera und Firefox NIghtly, von denen nur Chromium auf dem Pi verfügbar ist. Aber Chrom gibt mir einen webkitRTCPeerConnection is not definedFehler. Normalerweise benutze ich IceWeasel für WebRTC, aber das wird für Jitsi nicht unterstützt.
Modulitos

1
Auf dem PI gibt es keinen Browser, der WebRTC unterstützt, außer einer fast kaputten Unterstützung in IceWeasel. Ich benutze es wie folgt: Pi-> Jitsi-Server in der Cloud -> Mein PC an anderer Stelle
prinxis

1
UV4L unterstützt Hardware-codiertes H264-Live-Streaming ohne Latenz.
prinxis
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.