Video mit geringer Latenz, das in einem lokalen Gigabit-Netzwerk mit Linux gemeinsam genutzt wird

1232
user3387542

Für eine Robotikaufgabe müssen wir das Video (Webcam) live für etwa 6 oder 7 Benutzer im selben Raum freigeben. OpenCV wird auf den Clients verwendet, um die Situation zu lesen und neue Aufgaben an die Roboter zu senden. Die Latenz sollte nicht viel länger als eine Sekunde sein, je niedriger desto besser. Welche Befehle würdest du dafür empfehlen?

Wir haben eine Kamera auf einem Linux-Host, die das Video mit etwa 6 anderen Geräten teilen möchte, die nur wenige Meter entfernt sind.

Ich habe bereits mit verschiedenen Setups experimentiert. Während das Rohvideo absolut latenzfrei aussieht (Local Loopback, das Problem ist die Datenmenge), wird bei jeder Komprimierung plötzlich eine zweite Verzögerung angezeigt. Und wie sollen wir das im Netzwerk teilen. Ist der Rundfunk richtig? Wie kann es so schwer sein, dass sie direkt nebeneinander liegen.

Funktioniert lokal, Probleme über das Netzwerk.

#server ffmpeg -f video4linux2 -r 10 -s 1280x720 -i /dev/video0 -c:v libx264 -preset veryfast -tune zerolatency -pix_fmt yuv420p -f mpegts - | socat - udp-sendto:192.168.0.255:12345,broadcast #client socat -u udp-recv:12345,reuseaddr - | vlc --live-caching=0 --network-caching=0 --file-caching=0 - 

RAW-Video - perfekt in Ordnung, Videos mit vielen Artefakten, wenn sie über das Netzwerk gesendet werden

ffmpeg -f video4linux2 -r 10 -s 1280x720 -i /dev/video0 -c:v rawvideo -f rawvideo -pix_fmt yuv420p - | vlc --demux rawvideo --rawvid-fps 10 --rawvid-width 1280 --rawvid-height 720 --rawvid-chroma I420 - 

Die verwendete Technologie spielt keine Rolle, die Netzwerklast ist uns ebenfalls egal. Sie möchten opencv einfach auf verschiedenen Clients mit Live-Daten verwenden.

1
Frage aus Stackoverflow verschoben, da sie dort angehalten wurde und sagte, ich sollte sie an einen Superuser verschieben. http://stackoverflow.com/questions/43825945/low-latency-video-shared-in-local-gigabit-network- using-linux user3387542 vor 6 Jahren 0
Rundfunk ist definitiv die richtige Idee. Von welcher Auflösung und Framerate sprechen wir jedoch? 1280x720 @ 10fps (= 26, x MiB / s) sollten ohne Probleme funktionieren. Daniel B vor 6 Jahren 1
Die Kamera, die wir derzeit verwenden, könnte 1920x1080 @ 30hz (fullhd) unterstützen. Nichts gegen eine verbesserte Videoqualität. Nur gedacht, dass es zuerst klappt. Kennen Sie die Befehle, die funktionieren sollten? Mit welcher Kodierung haben Sie die 26.x MiB / s berechnet? user3387542 vor 6 Jahren 0
Das wäre rohes 24 Bit RGB. Sie können dies leicht überprüfen, indem Sie "pv -r" ("Rohransicht") in Ihr Testrohr einfügen. Daniel B vor 6 Jahren 1
Vielleicht versuchen Sie es mit [icecast] (http://icecast.org/), wenn Sie trotzdem eine Sendung benötigen? dirkt vor 6 Jahren 1
Ach ja, ich hatte nur einen anderen Gedanken: Würde der Empfänger ohne Pufferung und ohne ein geeignetes Stream-Format erkennen können, wann ein Frame beginnt und endet und wann er Daten verpasst hat? Daniel B vor 6 Jahren 1
Ich denke, das ist eigentlich das, was passiert ist und warum es nicht funktioniert hat oder nur mit vielen seltsamen farbigen Artefakten. Was würden Sie empfehlen, um dies zu vermeiden? user3387542 vor 6 Jahren 0

1 Antwort auf die Frage

0
plumpsack

OS: Debian Stretch

cat /etc/*release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" NAME="Debian GNU/Linux" VERSION_ID="9" VERSION="9 (stretch)" ID=debian HOME_URL="https://www.debian.org/" SUPPORT_URL="https://www.debian.org/support" BUG_REPORT_URL="https://bugs.debian.org/"  uname -v #1 SMP Debian 4.9.25-1 (2017-05-02)  cvlc --version VLC media player 2.2.6 Umbrella (revision 2.2.6-0-g1aae78981c) VLC-Version 2.2.6 Umbrella (2.2.6-0-g1aae78981c) Kompiliert von buildd auf binet.debian.org (May 24 2017 16:00:59) Kompiler: gcc version 6.3.0 20170516 (Debian 6.3.0-18) Dieses Programm kommt OHNE GEWÄHRLEISTUNG. Sie dürfen das Programm unter den Bedingungen der GNU General Public License weitergegeben; Für Details bitte die Datei COPYING ansehen. Geschrieben von der VideoLAN-Gruppe; zu sehen in der AUTHORS-Datei.  ffplay -version ffplay version 3.2.5-1 Copyright (c) 2003-2017 the FFmpeg developers built with gcc 6.3.0 (Debian 6.3.0-18) 20170516 configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 34.101 / 55. 34.101 libavcodec 57. 64.101 / 57. 64.101 libavformat 57. 56.101 / 57. 56.101 libavdevice 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libavresample 3. 1. 0 / 3. 1. 0 libswscale 4. 2.100 / 4. 2.100 libswresample 2. 3.100 / 2. 3.100 libpostproc 54. 1.100 / 54. 1.100  ffmpeg -version ffmpeg version 3.2.5-1 Copyright (c) 2000-2017 the FFmpeg developers built with gcc 6.3.0 (Debian 6.3.0-18) 20170516 configuration: --prefix=/usr --extra-version=1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libebur128 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared libavutil 55. 34.101 / 55. 34.101 libavcodec 57. 64.101 / 57. 64.101 libavformat 57. 56.101 / 57. 56.101 libavdevice 57. 1.100 / 57. 1.100 libavfilter 6. 65.100 / 6. 65.100 libavresample 3. 1. 0 / 3. 1. 0 libswscale 4. 2.100 / 4. 2.100 libswresample 2. 3.100 / 2. 3.100 libpostproc 54. 1.100 / 54. 1.100 

ffplay /dev/video0

Input #0, video4linux2,v4l2, from '/dev/video0':B sq= 0B f=0/0  Duration: N/A, start: 45810.627382, bitrate: 122880 kb/s Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 122880 kb/s, 25 fps, 25 tbr, 1000k tbn, 1000k tbc 

--> yuyv422

Perfect pair (raw video):

Server:

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 :v4l2-fps 25 --sout '#standard' 

Client:

ffplay -f rawvideo -pixel_format yuyv422 -video_size 640x480 -framerate 25 http://localhost:8081  (ffplay -f rawvideo -pixel_format yuyv422 -video_size 640x480 http://localhost:8081) (ffplay -f rawvideo -pixel_format yuyv422 -video_size 640x480 http://server-ip:8081) 

Sorry, don't have gbit-network nor 1080p-cam :(

For Raspberry Pi(3) users:

sudo modprobe bcm2835-v4l2 

(No Display/X11 on the pi3)

ffprobe /dev/video0  ffprobe version N-85344-gb438a78 Copyright (c) 2007-2017 the FFmpeg developers built with gcc 4.9.2 (Raspbian 4.9.2-10) configuration:  libavutil 55. 60.100 / 55. 60.100 libavcodec 57. 92.100 / 57. 92.100 libavformat 57. 72.100 / 57. 72.100 libavdevice 57. 7.100 / 57. 7.100 libavfilter 6. 84.100 / 6. 84.100 libswscale 4. 7.100 / 4. 7.100 libswresample 2. 8.100 / 2. 8.100 Input #0, video4linux2,v4l2, from '/dev/video0': Duration: N/A, start: 153.062714, bitrate: 283115 kb/s Stream #0:0: Video: rawvideo (I420 / 0x30323449), yuv420p, 1024x768, 283115 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc 

--> yuv420p

But with,

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=1024 :v4l2-height=768 :v4l2-fps=30 --sout '#standard' 

the result with

ffplay -f rawvideo -pixel_format yuv420p -video_size 1024x768 http://server-ip:3333 

on the client was not ok.

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=800 :v4l2-height=600 :v4l2-fps=16 --sout '#standard' 

(~12MBiT/s --> 100Mbit)

on the server and the result with

ffplay -f rawvideo -pixel_format yuv420p -video_size 800x600 http://server-ip:3333 

on the client was ok!

Könnte erklären, was die einzelnen Abschnitte sind und wie dies auf OP antwortet? music2myear vor 6 Jahren 0
Sorry, aber ich verstehe Ihre Frage nicht, vielleicht habe ich das Thema verpasst ... "Videos mit geringer Latenz im lokalen Gigabit-Netzwerk mit Linux" Ich gab eine Lösung für "fast" latenzfreies Roh-Video-Streaming. Fast ist abhängig von Host, Netzwerk und Clients (Leistung). Was verstehst du unter meiner Antwort nicht? plumpsack vor 6 Jahren 0
Sie haben eine Menge Befehle und deren Ausgabe veröffentlicht, aber nirgendwo haben Sie erwähnt, dass dies "fast niedrige Latenz" war, oder eine kurze Beschreibung, die das Endziel und die Rolle beschreibt, die jeder Schritt, den Sie in diese Lösung einbeziehen, spielt. Es braucht nicht viel, aber ein wenig mehr Erklärung der Erzählung wird diese Antwort erheblich verbessern. music2myear vor 6 Jahren 0
"Sie haben viele Befehle geschrieben ..." und was haben Sie nicht verstanden? plumpsack vor 6 Jahren 0
Ich bin kein OP. Die Antwort ist nicht für mich. Ich bin ein Benutzer dieser Website und möchte sicherstellen, dass Fragen und Antworten klar und gut sind, ob ich sie verstehe oder nicht. music2myear vor 6 Jahren 0
Was ist für "Sie" bei Befehlen wie cat / etc / * release, uname -v, cvlc --version, ffplay -version, ffmpeg -version, ffplay / dev / video0, ffprobe / dev / video0 nicht klar? plumpsack vor 6 Jahren 0