Streamen von H264 mit Logitech C920

13

Ich habe eine Logitech C920 Webcam. Es hat die Fähigkeit, das Video in H264 direkt zu kodieren.

Ich möchte reproduzieren, was mit einem Beaglebone gemacht wurde, aber mit einem Raspberry Pi: Senden Sie einen H264-Stream an das Netzwerk . Der Raspberry Pi ist dann nur hier, um den Stream in RTP zu paketieren, die Videokomprimierung erfolgt durch die Webcam selbst. Der H264-Modus wird mit video4linux erzwungen.

Bisher und wenn ich einen gemeinsamen Computer mit der neuesten Version von Ubuntu verwende, funktioniert dies mit VLC als Server oder GStreamer. Wenn ich zum Beispiel auf Raspberry Pi einen VLC-Server mit dem folgenden Befehl starte:

cvlc --sout=#rtp{sdp=rtsp://:8554/test} 'v4l2:///dev/video0:chroma=H264:width=800:height=600:fps=30'

... und wenn ich dann den Stream mit VLC auf einem anderen Computer lese, ist alles in Ordnung.

Wenn ich jedoch den Himbeer-Pi zum Senden des Videostreams verwende, ist das Ergebnis ziemlich schlecht. Viel Müll im Bild, sobald sich etwas bewegt. Image-Keys werden alle 10 Sekunden gut empfangen, aber in der Zwischenzeit ist es im Vergleich zum Stream von einem normalen Computer nicht gut genug.

Ich habe auch die für das Beaglebone beschriebene Methode mit dem mitgelieferten "Capture" -Dienstprogramm ausprobiert : ok, wenn ich von einem echten Computer streame , dasselbe Müllproblem, wenn ich von einem Raspberry Pi streame.

Es ist kein Netzwerkproblem: Ich habe einige Netzwerkprüfungen mit Wireshark und den Statistiken von VLC durchgeführt, es ist kein Paketverlust aufgetreten. Ich habe es mit Raspbian und Arch Linux für Raspi versucht (gstreamer 0.10 in raspbian, gstreamer 1.0 in Arch Linux).

Ich weiß nicht, ob es relevant ist oder nicht, aber ich habe es auch mit der Soft-Float-Support-Version von Raspbian getestet. Um einen 3.2-Kernel zu verwenden, muss zuerst ein Update durchgeführt werden. aber das gleiche problem, das video hat etwas müll.

Irgendeine Idee, was ich tun könnte, um die Videoqualität zu verbessern?

Vincent Hiribarren
quelle
Versuchen Sie, die Bildrate zu verringern. Die CPU des rPi ist sehr schlecht, daher ist es meiner Meinung nach zu viel, ein 800x600-Bild mit 30 fps zu übertragen. Nur die neue rPI-Kamerakarte, die über den MIPI / CIS-Anschluss (anstelle von USB) angeschlossen ist, überträgt 1080p mit 15-30 FPS.
Matthias
Es ist nicht FPS. Der Pi kann mit dem Pi-Kameramodul problemlos HD mit 60 fps verarbeiten. Wenn die Logitech-Kamera ein H264-Video sendet, ist es bereits codiert, und der Pi muss die Pakete neu übertragen, zu denen er vollständig in der Lage ist. Tatsächlich können 6 HD @ 25FPS-Streams erneut gesendet werden, bevor das Maximum erreicht ist. Es muss der V4L-Treiber sein, der Pakete beschädigt
Piotr Kula
Ich weiß, es ist ein alter Thread, aber hast du endlich etwas gefunden, das funktioniert? Ich versuche etwas ähnliches zu tun und stecke fest
Ajith
Ich habe ein Beaglebone benutzt und es hat besser funktioniert. Das Problem lag an einem fehlerhaften USB-Treiber für das RaspberryPi in Raspbian. Soweit ich mich erinnere, habe ich dasselbe System später mit einer neueren Version von Raspbian getestet und hatte weniger Müll. Ich habe vielleicht ein RPI-Update gemacht (wie in einer der Antworten angegeben), aber ich erinnere mich nicht gut. Sicher ist jedoch, dass die Leistung nach Verwendung einer aktualisierten Firmware / eines aktualisierten Betriebssystems besser war.
Vincent Hiribarren
Vincent, ich erhalte die Fehlermeldung, dass die URL v4l2 nicht geöffnet werden kann. Ist dieser Befehl jetzt veraltet?
Dalanmiller

Antworten:

5

Ich hatte das gleiche Problem, fand diesen Thread bei der Suche nach einem Hardware-Encoder, nicht bei c920-Problemen.

Führen Sie dennoch ein Firmware-Update für den Himbeer-Pi durch und der Müll sollte verschwunden sein

$> sudo rpi-update

Ich selbst habe die Lösung hier gefunden: http://wiki.matthiasbock.net/index.php/Logitech_C920,_streaming_H.264#Raspberry_Pi

Steffen
quelle
Um diese Frage zu schließen, akzeptiere ich diese Antwort. Das Problem lag an einem defekten USB-Treiber und einem Paketverlust bei der USB-Kommunikation. Ein aktualisiertes System / Firmware sollte den Trick tun.
Vincent Hiribarren
2

Sie können FFMPEG ausprobieren und verwenden. Das Problem ist jedoch, die Repository-Version nicht zu verwenden, da sie veraltet ist. Es gibt eine gegabelte Version, die sehr gut funktioniert.

Sie müssen es kompilieren, was ungefähr 5 Stunden dauert, oder eine vorkompilierte Binärdatei herunterladen.

Mit diesen Einstellungen können Sie die Daten vom V4L-Treiber an FFMPEG leiten. Wo das -i "fifo"nur sein sollte, um -iden Pipe-Stream zu erfassen und -fzu überprüfen, wie der H264 ausgegeben wird. Das FLV packt es erneut in das FLV, das mit HTML-Playern abgespielt werden kann.

ffmpeg -y \  
  -f h264 \  
  -i "$fifo" \  
  -c:v copy \  
  -map 0:0 \  
  -f flv "$urllocal"   

oder ein Beispiel Ich fand, dass Ziele V4L direkt, aber oyu muss die Kamera vorhanden sein, in der /dev/video* * ist 1oder mehr ...

ffmpeg -f video4linux2 -r 25 -s 640x480 -i /dev/video0 out.avi

Das gibt -fdas Format an, in dem die Ausgabe erfolgen soll. Das bedeutet nicht, dass es wie H264 in FLV transkodiert wird, sondern nur in das FLV-Format gewickelt wird. Ändern Sie dann die Adresse des VLC-Players Ihres Kunden. beispielsweise-f mpegts udp:192.168.1.19:1234

VLC scheint auf dem Pi nicht allzu gut zu funktionieren. Ich hatte sehr wenig Erfolg damit, das Pi cmaera-Modul über UDP auf meinen PC zu übertragen. Es hat funktioniert, aber es war nicht stabil.

Sie können sich auch ansehen, wie Sie nginx mit dem rtmp-Modul installieren, das ein Vergnügen ist. Schauen Sie sich diese Anleitung an, aber Sie müssen die Einstellungen etwas anpassen. Sie verbinden dann Ihren VLC-Player mit dem nginx-rtmp-Stream und es wird wie ein Zauber funktionieren.

Piotr Kula
quelle
1
Welche Gabelversion funktioniert gut?
Brian
1

Das scheint bei mir am wenigsten zu funktionieren ... cvlc v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 --sout="#transcode{vcodec=h264,vb=800,scale=1,acodec=mp4a,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/live.ts}" -I dummy

Philippe Gachoud
quelle
0

Versuchen Sie es mit einem größeren Puffer auf dem Client, der das Video anzeigt. Für mich gibt es dramatische Unterschiede zwischen 1000ms Buffer und 200ms Buffer. 5000ms Buffer sieht besser aus als 1000ms Buffer.

: Network-Caching = 2000

Odie
quelle
Es sollte mit 0 Caching mit dem seltsamen Jittering im LAN funktionieren. Ich habe das Pi-Kameramodul ohne Probleme so funktionieren lassen.
Piotr Kula
0

Ich habe im Himbeerforum eine mögliche Lösung veröffentlicht , die einen leichten RTSP-Server auf der Basis von live555 verwendet , der H264 von einem V4L2-Treiber aufzeichnet. Es ist über github h264_v4l2_rtspserver verfügbar

Dies wurde für die Raspikamera gemacht, sollte aber mit jedem V4L2-Gerät funktionieren, das H264 bietet.

mpromonet
quelle
-1

Wenn ich Ihre Situation gut verstanden habe, möchten Sie, dass Raspberry Videos in H264 umcodiert? Ich denke, das ist der Grund, warum Sie schlechte Leistung erhalten, weil VLC Software-Codierung verwendet und Raspberry für diese Aufgabe nicht leistungsfähig ist.

Ich würde vorschlagen, es mit Gstreamer und gst-omxPlugins zu versuchen . Es gibt ein Element für die Hardware-Videokodierung, das einen guten Server aus Ihrer Himbeere machen würde.

10robinho
quelle
1
Wie er sagte, bietet die Logitech-Kamera bereits H.264. Das rPi transportiert also nur Frames, führt aber keine Codierung durch.
Matthias
Er transkodiert nicht. Senden Sie die Daten einfach erneut. Wie in es verwendet Stream direkt.
Piotr Kula