gstreamer с N источниками / производителями и N потребителями - PullRequest
0 голосов
/ 05 декабря 2018

У меня N камер, каждая на разных машинах (производителей).Нам нужно отправить это видео с камеры на 1 центральный сервер, с которого N потребителей могут выбирать и воспроизводить выбранное видео.Возможно ли достичь этого по сети с помощью gstreamer?Если да, какие элементы мы должны использовать в этом?Цените, если кто-то может помочь или дать несколько советов.Спасибо!

enter image description here

Мне удалось достичь этого двумя способами, как указано в ответе ниже

Я не смог найти ни одного примерана как использовать селектор ввода или где мы упоминаем, какой вход выбрать и воспроизвести .Не могли бы вы привести пример?Я попробовал тройник.Как я понимаю, я могу воспроизвести данные от производителя 1 в 2 клиентах.т.е. одни и те же данные могут быть разделены и переданы N потребителям.Я не мог найти пример, чтобы выбрать и играть с ти.Любые указатели будут очень полезны. Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Мне удалось достичь этого двумя способами

Подход 1) каждый отправитель будет отправлять на разные порты (0 - 65535) на сервере.Здесь вместо камеры используется 2 mp4 файла.

производитель1 : SRCID=1 PT=26 SERVER=127.0.0.1 PORT=5200 bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" filesrc location="video1.mp4" ! decodebin ! jpegenc ! rtpjpegpay ! "application/x-rtp,payload=$PT,clock-rate=90000,ssrc=(uint)$SRCID" ! r.send_rtp_sink_$SRCID r.send_rtp_src_$SRCID ! udpsink host=$SERVER port=$PORT'

производитель2 : SRCID=1 PT=26 SERVER=127.0.0.1 PORT=5201 bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" filesrc location="video2.mp4" ! decodebin ! jpegenc ! rtpjpegpay ! "application/x-rtp,payload=$PT,clock-rate=90000,ssrc=(uint)$SRCID" ! r.send_rtp_sink_$SRCID r.send_rtp_src_$SRCID ! udpsink host=$SERVER port=$PORT'

приемник 1 (которыйвоспроизводит данные из порта 5200): SRCID=1 PT=26 PORT=5200 CAPS_V="media=video,clock-rate=90000,encoding-name=JPEG,payload=$PT" bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" udpsrc port=$PORT ! "application/x-rtp,$CAPS_V" ! r.recv_rtp_sink_$SRCID r.recv_rtp_src_${SRCID}_${SRCID}_$PT ! rtpjpegdepay ! decodebin ! autovideosink'

приемник 2 (который воспроизводит данные из порта 5201): SRCID=1 PT=26 PORT=5201 CAPS_V="media=video,clock-rate=90000,encoding-name=JPEG,payload=$PT" bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" udpsrc port=$PORT ! "application/x-rtp,$CAPS_V" ! r.recv_rtp_sink_$SRCID r.recv_rtp_src_${SRCID}_${SRCID}_$PT ! rtpjpegdepay ! decodebin ! autovideosink'

подход 2) Теперь второй способ заключается в изменении типа полезной нагрузки и ssrc.Но это не кажется хорошим подходом, а также не правильным подходом.Потому что у нас нет типа полезной нагрузки N

производитель1 : SRCID= 1 PT=$((SRCID+100)) SERVER=127.0.0.1 PORT=5200 bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" filesrc location="video1.mp4" ! decodebin ! jpegenc ! rtpjpegpay ! "application/x-rtp,payload=$PT,clock-rate=90000,ssrc=(uint)$SRCID" ! r.send_rtp_sink_$SRCID r.send_rtp_src_$SRCID ! udpsink host=$SERVER port=$PORT'

производитель2 : SRCID= 2 PT=$((SRCID+100)) SERVER=127.0.0.1 PORT=5200 bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" filesrc location="video2.mp4" ! decodebin ! jpegenc ! rtpjpegpay ! "application/x-rtp,payload=$PT,clock-rate=90000,ssrc=(uint)$SRCID" ! r.send_rtp_sink_$SRCID r.send_rtp_src_$SRCID ! udpsink host=$SERVER port=$PORT

, но в этомслучай, с файлами mp4 я могу играть только по одному за раз.Но когда я попробовал с 2 веб-камеры с 2 разных машин, он играл одновременно.

Таким образом, используется приемник

receiver1 (который воспроизводит srcid 1): SRCID= 1 PT=$((SRCID+100)) PORT=5200 CAPS_V="media=(string)video,clock-rate=(int)90000,encoding-name=(string)JPEG,payload=$PT" bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" udpsrc port=$PORT ! "application/x-rtp,$CAPS_V" ! r.recv_rtp_sink_$SRCID r.recv_rtp_src_${SRCID}_${SRCID}_$PT ! rtpjpegdepay ! decodebin ! autovideosink'

иизмените SRCID на 2, чтобы воспроизвести второе видео.

приемник2 (который воспроизводит srcid 2): SRCID= 2 PT=$((SRCID+100)) PORT=5200 CAPS_V="media=(string)video,clock-rate=(int)90000,encoding-name=(string)JPEG,payload=$PT" bash -c 'gst-launch-1.0 -e rtpbin name=r sdes="application/x-rtp-source-sdes" udpsrc port=$PORT ! "application/x-rtp,$CAPS_V" ! r.recv_rtp_sink_$SRCID r.recv_rtp_src_${SRCID}_${SRCID}_$PT ! rtpjpegdepay ! decodebin ! autovideosink'

0 голосов
/ 05 декабря 2018

Есть несколько способов сделать это.Одним из способов, который я предлагаю, является использование RTP/UDP потоковой передачи.Это случай одного сервера с множеством клиентов, и его можно легко обработать с помощью RTP.Каждый производитель может запустить конвейер по линиям:

v4l2src -> xenc -> codec_parse -> rtpxpay -> rtpbin.send_rtp -> udpsink host=<server _addr> -> rtpbin.send_rtcp udpsink host=<server_addr> -> udpsrc -> rtpbin.recv_rtcp

Вы можете игнорировать RTCP, если ваше приложение не требует обратной связи о состоянии сети и передаче пакетов.На сервере вы можете запустить элемент output selector, который в зависимости от вашего приложения выбирает, какие данные камеры будут отображаться.Вы также можете посмотреть элемент tee вместо output selector, если он лучше подходит для вашего варианта использования.

...