我正在使用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流,对其进行同步并将它们输出到正确的接收器吗?
答案 0 :(得分:0)
使用gstreamer管道无法做到这一点。您所能做的就是动态创建会话,然后为每个会话分配正确的appsink。
答案 1 :(得分:0)
您应该在RTP标头中使用SSRC,以确保区分管道。 如果没有记错的话,SSRC值就是(recv_rtp_src_%u_%u_%u)中的名称之一。
如果您不能在视频源中强制执行SSRC,则可以尝试将此管道作为两个单独的管道运行。