具有 N sources/producers 和 N 个消费者的 gstreamer

gstreamer with N sources/producers and N consumers

我有 N 个摄像头,每个都在不同的机器(生产商)上。我们需要将这些摄像头视频发送到 1 个中央服务器,N 个消费者可以从该服务器 select 播放 select 编辑的视频。是否可以使用 gstreamer 通过网络实现此目的?如果是,我们必须在其中使用哪些元素?感谢是否有人可以提供帮助或提供一些指示。谢谢!

我能够通过以下回答中给出的两种方式实现这一点

我找不到关于如何使用输入的任何示例-select或我们在哪里提到哪个输入是select 玩过。你能举个例子吗?我试过开球。据我了解,使用 tee,我可以在 2 个客户端中播放来自生产者 1 的数据。即相同的数据可以拆分并提供给 N 个消费者。我找不到 select 的示例并玩 tee。任何指针都会非常有帮助。 谢谢!

有多种方法可以做到这一点。我建议的方法之一是使用 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,以防它更适合您的用例。

我可以通过两种方式实现这一目标

方法 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'

生产者2SRCID=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'

receiver 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'

receiver 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) 现在第二种方法是更改​​ payload 类型和 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'

生产者2SRCID= 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 以播放第二个视频。

receiver2(播放 srcid 2): SRCID=2PT=$((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'