我有N台相机,每台都在不同的机器(生产者)上。我们需要将这些摄像机视频发送到1个中央服务器,N个消费者可以从中选择并播放选定的视频。是否可以使用gstreamer通过网络实现此目标?如果是,那么我们必须在其中使用哪些元素?感谢是否有人可以提供帮助或提供一些指示。谢谢!
我能够通过以下答案中给出的两种方式实现这一目标
在如何使用输入选择器或我们在哪里提到要选择并播放的输入上找不到任何示例。你能举个例子吗?我尝试过T恤。据我了解,使用tee可以在2个客户端中播放生产者1的数据。即可以将相同的数据拆分并提供给N个消费者。我找不到选择和使用tee的例子。任何指针将非常有帮助。 谢谢!
答案 0 :(得分:0)
有几种方法可以执行此操作。我建议一种方式是使用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)
我能够通过两种方式实现
方法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'
producer2 :
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'
producer2 :
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个网络摄像头时,它们同时播放。
所以使用的接收器是
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=
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'