Ich habe den Pi B + und die Pi-Kamera und versuche nun, die effizienteste (niedrige CPU) und Konfiguration mit der geringsten Latenz zu finden, um H.264-codiertes Video von der Kamera auf meinen Heimserver zu streamen.
Ich habe folgendes gelesen:
(Alle Links verwenden gstreamer-1.0 von deb http://vontaene.de/raspbian-updates/ . main
.)
In den letzten Jahren wurde in dieser Hinsicht viel getan.
Ursprünglich mussten wir die Ausgabe von raspivid
in umleiten gst-launch-1.0
(siehe Link 1).
Dann ist (Link 2) die offiziellen V4L2 Fahrer geschaffen , die heute Standard ist, und es ermöglicht, die Daten direkt ohne ein Rohr zu erhalten, mit nur gstreamer (siehe insbesondere den Beitrag von towolf »Sa 7. Dezember 2013 03.34 in Verbindung 2):
Absender (Pi): gst-launch-1.0 -e v4l2src do-timestamp=true ! video/x-h264,width=640,height=480,framerate=30/1 ! h264parse ! rtph264pay config-interval=1 ! gdppay ! udpsink host=192.168.178.20 port=5000
Empfänger: gst-launch-1.0 -v udpsrc port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! fpsdisplaysink sync=false text-overlay=false
Wenn ich das richtig verstehe, verwenden beide Wege die GPU, um die H264-Dekodierung durchzuführen, aber letztere ist ein bisschen effizienter, da sie nicht ein weiteres Mal durch den Kernel gehen muss, da es keine Pipe zwischen den beteiligten Prozessen gibt.
Jetzt habe ich einige Fragen dazu.
Ist letzteres immer noch der neueste Weg, um H264 effizient aus der Kamera zu holen? Ich habe darüber gelesen
gst-omx
, was gstreamer Pipelines so zulässt... video/x-raw ! omxh264enc ! ...
. Hat dies etwas anderes zu tun als nur zu verwendenvideo/x-h264
, oder könnte es sogar effizienter sein? Was ist der Unterschied?Wie finde ich heraus, welches gstreamer-Codierungs-Plugin tatsächlich verwendet wird, wenn ich die
video/x-h264 ...
Pipeline verwende? Dies scheint nur das Format anzugeben, das ich möchte, im Vergleich zu den anderen Pipeline-Teilen, bei denen ich die (Code-) Komponente explizit benenne (wieh264parse
oderfpsdisplaysink
).In dieser Antwort zu Link 1 erwähnt Mikael Lepistö "Ich habe einen unnötigen Filterpass von der Streaming-Seite entfernt" , was bedeutet, dass er das
gdppay
und ausschneidetgdpdepay
. Was machen die? Warum werden sie gebraucht? Kann ich sie wirklich ausziehen?Er erwähnt auch, dass er durch Angabe von
caps="application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, payload=(int)96"
Parametern für dieudpsrc
empfangende Seite das Streaming in der Mitte des Streams starten / fortsetzen kann. Was erreichen diese Kappen, warum diese spezifischen Entscheidungen, wo kann ich mehr darüber lesen?Wenn ich das mache, was in Frage 3 und 4 vorgeschlagen wird (Hinzufügen von
caps
, Löschen vongdppay
undgdpdepay
), wird meine Videolatenz viel schlimmer (und es scheint sich zu häufen, die Latenz nimmt mit der Zeit zu und nach ein paar Minuten stoppt das Video)! Warum könnte das so sein? Ich möchte die Latenz erhalten, die ich mit dem ursprünglichen Befehl erhalten habe, habe aber auch die Möglichkeit, mich jederzeit dem Stream anzuschließen.Ich habe gelesen, dass RTSP + RTP normalerweise eine Kombination aus TCP und UDP verwendet: TCP für Kontrollnachrichten und andere Dinge, die nicht verloren gehen dürfen, und UDP für die eigentliche Videodatenübertragung. Verwende ich in den obigen Setups das tatsächlich oder verwende ich nur UDP? Es ist für mich ein bisschen undurchsichtig, ob GSTREAMER sich darum kümmert oder nicht.
Ich würde mich über jede Antwort auf eine dieser Fragen freuen!
cat file | grep ...
statt grep ... file
. Die Pipe fügt dem Kernel eine weitere Kopierschicht hinzu, die insbesondere auf Geräten mit geringer Speicherbandbreite leicht messbar ist. Wenn gstreamer direkt aus der Gerätedatei lesen kann, warum nicht? In Bezug auf Ihren raspivid | cvlc
Vorschlag: Ich habe diesen verwendet, bevor ich auf die auf gstreamer basierende Lösung umgestiegen bin. Er hat bis zu 3 Sekunden mehr Latenz als gstreamer (ich weiß nicht warum).
cvlc
braucht man ~ 45%, aber wenn man nur mit dieser Datenrate durch eine Pipe läuft (wenn man noch einmal bedenkt, dass die Pipe es nicht verlangsamt ), würde sich die Nadel kaum bewegen, denke ich. Wie <5%. Es ist natürlich nicht unerheblich, ob Sie dies so effizient wie möglich tun möchten ...
raspivid | cvlc
, und das sind 40-50%. Menschen können besser auf eine Frage antworten, die sie dazu auffordert, sich an einer bestimmten Zahl zu verbessern. Im Moment fragen Sie eine Menge nach dem Warum, ohne zu erklären, warum jedes Warum von Bedeutung ist.
|
in diesem Zusammenhang zu Problemen führt, ist ein unglaubliches Stück BS. Haben Sieraspivid | cvlc
Methoden ausprobiert ? Ich hatte die Kamera nicht sehr lange oder nicht sehr lange zum Spielen, aber esvlc
scheint in Ordnung zu sein, damit einen http-Stream zu erzeugen (der unter Linux am anderen Ende angezeigt werden kann ).