1

Для выполнения задачи робототехники нам необходимо поделиться видео (веб-камерой) в прямом эфире примерно 6 или 7 пользователям в одной комнате. OpenCV будет использоваться на клиентах для чтения ситуации и отправки новых задач роботам. Задержка не должна быть намного больше одной секунды, чем ниже, тем лучше. Какие команды вы бы порекомендовали для этого?

У нас есть одна камера на хосте Linux, которая хочет передать видео примерно 6 другим устройствам, находящимся всего в нескольких метрах.

Я уже экспериментировал с различными настройками. Хотя raw-видео выглядит совершенно без задержек (локальная петля, проблема заключается в объеме данных), любое сжатие внезапно сообщает о второй задержке. И как мы должны поделиться этим в сети. Является ли вещание правильным подходом? Как это может быть так сложно, они рядом друг с другом.

Работает локально, проблемы по сети.

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

необработанное видео - идеально, как это, видео со множеством артефактов, если оно отправлено по сети

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 -

Используемая технология не имеет значения, мы не заботимся о загрузке сети. Просто хочу использовать opencv на разных клиентах, использующих живые данные.

1 ответ1

0

ОС: 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

Идеальная пара (необработанное видео):

Сервер:

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=640 :v4l2-height=480 :v4l2-fps 25 --sout '#standard{access=http,mux=raw,dst=:8081}'

Клиент:

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)

Извините, нет ни gbit-сети, ни 1080p-камеры :(

Для пользователей Raspberry Pi(3):

sudo modprobe bcm2835-v4l2

(Нет дисплея /X11 на 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

Но с,

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=1024 :v4l2-height=768 :v4l2-fps=30 --sout '#standard{access=http,mux=raw,dst=:3333}'

результат с

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

на клиенте не было в порядке.

cvlc -vvv v4l2:// :v4l2-dev=/dev/video0 :v4l2-width=800 :v4l2-height=600 :v4l2-fps=16 --sout '#standard{access=http,mux=raw,dst=:3333}'

(~ 12 Мбит / с -> 100 Мбит)

на сервере и результат с

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

на клиенте было ок !

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .