Wie kann ich Raspivid dazu bringen, die h264-Codierung zu überspringen? (5 Sekunden Latenz Streaming Video loswerden)

11

Es gibt unzählige Foren und Threads, in denen es darum geht, eine Latenz von 5 Sekunden zu vermeiden, wenn ein Pi zusammen mit einer PI-Cam als Überwachungskamera verwendet wird. Viele Tutorials zeigen, wie Sie mit vlc die Bilder mithilfe des RTP-Protokolls codieren und streamen, was zu einer Verzögerung von ~ 5 Sekunden führt.

Meiner Meinung nach ist der Grund dafür, dass raspivid den Stream in H264 codiert, während VLC ihn erneut decodieren und in RTP umcodieren muss. Die Befehlszeile sieht folgendermaßen aus:

raspivid -w 640 -h 480 -o - -t 0 |cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Der erste Teil weist raspivid an, Videos zur Standardausgabe zu streamen:

raspivid -w 640 -h 480 -o - -t 0 

Das Teil nach dem Rohr weist VLC an, es aufzunehmen und mit h264 zu dekodieren:

cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/}' :demux=h264

Dieses Muxen und Demuxen ist eine ziemliche Menge an Ressourcen!

Ich habe die Quellen von Raspicam bei Github gefunden, und ich denke, dass mit der Methode encoder_buffer_callback (derzeit in Zeile 848) etwas getan werden kann, um die Codierung zu überspringen. Allerdings bin ich nicht gut in c und überhaupt nicht mit Videokodierung vertraut, daher habe ich keine Ahnung, wo ich anfangen soll.

Auf Github sehe ich 330 Gabeln, aber sie scheinen nicht speziell für Raspicam zu sein (eher für das gesamte Userland-Projekt). Ich habe mich beim Versuch, eine Abzweigung zu finden, die die Codierung entfernt oder etwas Einfacheres wie mjpeg implementiert hat, verlaufen.

Könnte jemand mit C- und Video-Codec-Kenntnissen mir und den anderen Millionen Benutzern helfen, die Latenz zu beseitigen? Wahrscheinlich ist die Lösung bereits in einer dieser Gabeln vorhanden, aber ich habe stundenlang ohne Glück danach gesucht.

ps Ich suche keine Browser-Lösung , möchte sie aber letztendlich zu einer Synology streamen, vorzugsweise mit MJPEG-Streaming (jedoch nicht über eine Webseite, sondern über einen Standard-MJPEG-Stream, der in die meisten kommerziellen IP-Cams integriert ist). Der erste Schritt ist, h264 loszuwerden.

Louis Somers
quelle
Das ist eine sehr gründliche Untersuchung. Die Verwendung von MJPEG kommt nicht in Frage, da (zu der Zeit, als ich nachgesehen habe) der eingebaute JPEG-Encoder keine Bibliothek hatte und die Software Müll war. Ich habe es geschafft, mit nginx-rtmp (FLV-Paket), Custom Build, in HD eine Verzögerung von ungefähr 1 Sekunde zu erreichen! Der Pi verwendete ungefähr 30% CPU, aber VLC hatte Schwierigkeiten, ihn zu dekodieren, weil Zeitrahmen fehlten und weil sein FLV :( Auch meine CCTV-Software verwendete eine VLC-Senke und 1 720p-Stream verwendete 40% CPU, als ich ihn endlich zum Laufen brachte, war aber sehr instabil.
Piotr Kula
@ppumkin Ich glaube nicht, dass MJPEG nicht in Frage kommt. Sobald H264 weg ist, können wir nach Belieben codieren, ohne den Aufwand für das Decodieren und Neucodieren zu haben. Eigentlich ist H264 ein ziemlicher Luxus! Nur wir sollten es ausschalten können. Es ist wie ein luxuriöser, mit Pluche gepolsterter und diamantbesetzter Thron in einer engen Toilettenkammer, sodass nichts anderes in den Raum passt (außer etwas Kopffreiheit, in der wir ein wenig auf und ab springen können) ... wenn Sie die Tür öffnen, müssen Sie klettern über einer hohen Armlehne, und wenn Sie sitzen, gibt es keinen Platz für Ihre Beine ...
Louis Somers
Ja, ich verstehe, was du meinst. Ich habe Tage damit verbracht, MJPEG in einer anständigen Qualität auf meinen CCTV-IP-Server zu bringen. Viele Dinge haben sich geändert, aber eine direkte Hardware-JPEG-Codierung und Weiterleitung an einen Stream ist nicht vorhanden, da die API nicht verfügbar ist. Ich kenne nur Software und die beste Lösung, die ich gefunden habe, war die JPEG-Senke nginx-rtmp. HLS für iPhone funktioniert eigentlich großartig, aber es hat eine Verzögerung von 5s-10s :(
Piotr Kula
1
Sie können versuchen, dies als Frage zum Github-Projekt für die Kamerasoftware zu stellen. Sie werden wahrscheinlich eine Erklärung erhalten, warum dies schwierig ist, aber wenn andere es als nützliche Funktion empfinden, wird es möglicherweise von jemandem implementiert.
TomG
Demux ist nicht dasselbe wie Dekodieren ... bitte überprüfen Sie dies
Flash Thunder

Antworten:

5

Das ist wahrscheinlich nicht das, was Sie von Antworten erwarten, aber ich empfehle VLC-Streaming überhaupt nicht.

Für ein Schulprojekt habe ich einige Streaming-Optionen ausprobiert (auch auf RPi!):

  • VLC
  • MJPEG
  • GStreamer

Mit VLC und MJPEG (und einigen anderen weniger bekannten) hatte ich eine Latenz zwischen 3 und 5 Sekunden.
Mit GStreamer KEINE LATENZ und mit der besten Auflösung (und vielen weiteren Optionen)!
Wenn Sie interessiert sind, können Sie es hier überprüfen .

Und wenn Sie es verwenden, ist hier meine Pipeline:

raspivid -t 0 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o - | gst-launch-1.0 -v fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=YOUR_IP port=YOUR_PORT
Val
quelle
1
Ja, ich habe Gstreamer bereits ausprobiert und es funktioniert hervorragend beim Streaming auf einen PC oder so, aber es funktioniert nicht gut mit Software von Drittanbietern wie der Synology DiskStation. Es sieht so aus, als würde GStreamer den h264-Stream nur wiederverwenden und ein Streaming-Protokoll um ihn wickeln, ohne ihn zu dekodieren. Dies ist eine großartige Lösung, aber leider für eine kleine Anzahl von Anwendungsfällen. Wenn ich den Stream auf einem Android-Gerät sehen möchte, muss ich meine eigene App dafür entwickeln. MJPEG wird viel häufiger unterstützt, und ich bin sicher, dass Raspivid geändert werden kann, um unnötige Codierungen zu überspringen und dies VLC oder so zu überlassen. Vielen Dank für den Tipp auf jeden Fall
Louis Somers
1
Ich habe auch eine Synology, habe aber GStreamer nicht ausprobiert (meine ist meiner Meinung nach nicht leistungsfähig genug). Übrigens, über Android können Sie auch GStreamer verwenden! Ich benutze es für mein Projekt und es funktioniert gut :)!
Val
Problem mit gstreamer Es enthält kein Zeitintervall in den Rahmendaten und es ist als Senke unbrauchbar (auch wenn die Option hinzugefügt wurde !!) :( Es gibt Mod-Skripte, über die Pipe übertragen werden kann, aber ich habe festgestellt, dass Gstreamer häufig VLC-Bomben erhalten hat Vor 6 Monaten, als ich nach einer Videoüberwachung suchte, aber es hat nie zuverlässig funktioniert :(
Piotr Kula
@Val true, es gibt ein SDK für Android, aber nicht viele Out-of-the-Box-Player im Play-Store, die Pipelines wie gst-launch-1.0 -v tcpclientsrc host = 11.22.33.44 port = 1234 unterstützen! gdpdepay! rtph264depay! avdec_h264! Videokonvertierung! autovideosink sync = false. Für iOS gibt es noch weniger. Die Synology ist ein großartiger Hub, der die meisten gängigen Geräte unterstützt und Bewegungserkennung, Aufzeichnung und Benachrichtigungen sofort (und ohne SD-Karten) durchführen kann.
Louis Somers
Benutzt du das immer noch so? Es gibt den neuen U4VL-Treiber, aber immer noch die gleichen Verzögerungsprobleme mit h264-Streaming zu VLC
Piotr Kula
0

Einige Leute haben hart daran gearbeitet, seit ich diese Frage zum ersten Mal gestellt habe, und zu diesem Zeitpunkt gibt es einige Optionen (seltsam, dass noch niemand auf diese Frage geantwortet hat). Ich habe RaspberrIPCam ausprobiert und hatte einige Erfolge, aber es scheint, dass die RTSP-Pakete eine extrem kurze TTL oder so hatten. Wenn der Pi direkt an einen Router neben meinem PC angeschlossen ist, funktioniert er perfekt. Aber sobald ich die Kamera dort installiert hatte, wo ich sie haben wollte, und versuchte, mit zwei Routern dazwischen auf den Stream zuzugreifen, kam kein Image an. Ich habe den Quellcode überprüft und festgestellt, dass die TTL auf Maximum eingestellt ist. Ich habe es nie ganz herausgefunden.

Derzeit würde ich RaspberryIPCamera empfehlen , die eine schöne Benutzeroberfläche hat (siehe Screenshots ) und sogar ein fertiges SD-Karten-Image dafür hat. Ich habe die SD-Karte ausprobiert, aber mit großem Erfolg eine manuelle Installation wie hier beschrieben durchgeführt (mein aktuelles Setup). Anweisungen zum Anschließen an eine Synology DiskStation sind ebenfalls verfügbar und funktionieren auf meinem System einwandfrei. Das Problem mit dem SD-Karten-Image war, dass ich das Dateisystem nicht in vollem Umfang auf die SD-Karte erweitern konnte (ich möchte auch einige andere Dinge darauf ausführen, um einige Relais über die GPIO-Pins zu steuern).

Die obige Lösung verwendet Komponenten des UV4L-Projekts. In der Dokumentation des UV4L-Projekts auf dieser Seite wird außerdem Folgendes erwähnt:

Unter anderem bietet es eine Weboberfläche, über die der Videostream auf verschiedene Arten angezeigt werden kann, und eine Steuerungsseite, auf der die Kameraeinstellungen beim Streaming mit einer beliebigen Video4Linux-Anwendung vollständig gesteuert werden können.

Ich habe es aber noch nicht ausprobiert (da ich mein aktuelles Setup nicht durcheinander bringen möchte).

Louis Somers
quelle
1
Sie sind sich nicht sicher, ob dies Ihr Problem war. Wenn Sie jedoch Multicast-RTSP-Verkehr über einen Router senden, stellen Sie sicher, dass IGMP-Snooping aktiviert ist, und stellen Sie sicher, dass Ihr PC die IGMP-Abfragen vom Router nicht blockiert. Andernfalls merkt der Router nicht, dass Ihr PC versucht, die Pakete zu empfangen, und leitet sie daher niemals weiter.
Malvineous