RTPbin接收具有相同编解码器的两个源随机交换接收器

时间:2019-06-24 00:58:32

标签: gstreamer gstreamer-1.0

我正在使用RTPBin接收到两个通过NTP时钟同步的UDP流,这些数据流将由我自己的应用程序使用两个appsinks接收,如以下管道所示。在运行该应用程序的90%的时间内,这种方法可以正常工作。

rtpbin name=rtpbin latency=80 \
udpsrc caps=\"application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264\" \
port=40322 ! rtpbin.recv_rtp_sink_0 \
rtpbin. ! rtph264depay ! queue ! avdec_h264 ! videoconvert ! video/x-raw,format=RGBA,width=1296,height=972 ! appsink name=appsink_0_left \
udpsrc port=40323 ! rtpbin.recv_rtcp_sink_0 \
udpsrc caps=\"application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H264\" \
port=40320 ! rtpbin.recv_rtp_sink_1 \
rtpbin. ! rtph264depay ! avdec_h264 ! videoconvert ! video/x-raw,format=RGBA,width=1296,height=972 ! appsink name=appsink_1_right \
udpsrc port=40321 ! rtpbin.recv_rtcp_sink_1

但是,在执行时,有时两个rtpbin会话将被交换,appsink#0将接收流#1而不是流#0,反之亦然。这以看似随机的频率发生。我的应用程序涉及立体映射,因此,每个应用接收器接收正确编号的流非常重要。

理论上,每个RTP会话均由RTPBIN编号,然后作为recv_rtp_src_%u_%u_%u(其中第一个%u是会话号)发送到rtph264depay。不幸的是rec_rtp_src_%u_%u_%u是动态生成的,似乎无法访问,因此您必须使用RTPBin。它会自动选择编号最低的第一个可用流,这是90%的时候是正确的流,但有时是错误的流。

是否可以选择将哪个RTP会话/流传递到哪个接收器?另外,还有另一种方法来接收两个UDP流,对其进行同步并将它们输出到正确的接收器吗?

2 个答案:

答案 0 :(得分:0)

使用gstreamer管道无法做到这一点。您所能做的就是动态创建会话,然后为每个会话分配正确的appsink。

答案 1 :(得分:0)

您应该在RTP标头中使用SSRC,以确保区分管道。 如果没有记错的话,SSRC值就是(recv_rtp_src_%u_%u_%u)中的名称之一。

如果您不能在视频源中强制执行SSRC,则可以尝试将此管道作为两个单独的管道运行。