为何'gst.Element.get_request_pad(self.filter, 'filter')'返回'None' (gstreamer | python)
我刚接触gstreamer和它的开发,正在尝试用Gstreamer Python来混合RTP流。客户端会发送不同的视频测试源,而这些流的混合应该在接收端通过RTP进行。这个功能至少要支持四个参与者。
接收端会先有一个已经链接好的视频测试背景,这个背景会首先显示。当接收端收到视频测试源后,就应该在这个背景上进行视频源的混合并显示出来。
这是接收端的代码“receiver.py”:http://pastebin.com/dM2LcNM2。
这是客户端的代码“send_client.py”:http://pastebin.com/33edcQ40。
我遇到了这样的错误信息:
ankit@fh:~/$ ./receiver4.py
Started...
Running...
new ssrc
session 0
ssrc 3217594798
3217594798
filter: /GstPipeline:server/GstCapsFilter:filter (__main__.GstCapsFilter) || Type:: <class '__main__.__main__.GstCapsFilter'>
srcpad1: /GstPipeline:server/GstUDPSrc:udpsrc0.GstPad:src (gst.Pad) || Type::: <type 'gst.Pad'>
sinkpad1: None
Traceback (most recent call last):
File "./receiver4.py", line 132, in on_new_ssrc
lres = gst.Pad.link(srcpad1, sinkpad1)
TypeError: GstPad.link() argument 1 must be gst.Pad, not None
我不明白为什么在请求'sinkpad1'时会得到'None'。在文档中提到,updsrc的sinkpad是“按需提供”的。
附注:请参考代码,以了解我获取'sinkpad1'时使用的语法和逻辑。
我无法让它运行起来,花了很多时间寻找解决方案。请有人帮我找出逻辑错误。提前谢谢大家。
1 个回答
0
这是我最终找到的解决方案。 :)
我之前忘记了要使用从客户端接收到的'rptbin'。关于'gstrtpbin'的Pad属性(可以通过$gst-inspect gstrtpbin
查看)如下:
Pad Templates:
SINK template: 'recv_rtp_sink_%d'
Availability: On request
Has request_new_pad() function: gst_rtp_bin_request_new_pad
Capabilities:
application/x-rtp
SINK template: 'recv_rtcp_sink_%d'
Availability: On request
Has request_new_pad() function: gst_rtp_bin_request_new_pad
Capabilities:
application/x-rtcp
SINK template: 'send_rtp_sink_%d'
Availability: On request
Has request_new_pad() function: gst_rtp_bin_request_new_pad
Capabilities:
application/x-rtp
SRC template: 'recv_rtp_src_%d_%d_%d'
Availability: Sometimes
Capabilities:
application/x-rtp
SRC template: 'send_rtcp_src_%d'
Availability: On request
Has request_new_pad() function: gst_rtp_bin_request_new_pad
Capabilities:
application/x-rtcp
SRC template: 'send_rtp_src_%d'
Availability: Sometimes
Capabilities:
application/x-rtp
从上面的Pad属性来看,我需要使用'recv_rtp_sink_%d'这个pad,它只有在请求时才会出现。
我对源文件'receiver.py'进行了替换和修改:
@line 130: sinkpad1 = gst.Element.get_request_pad(rtpbin, 'recv_rtp_sink_%d')
@line 132: we do not need to link this as it is already linked above. DELETED
@line 133: we have unlink udpsrc0 then link it. unlink eg.: self.udpsrc0.unlink(rtpbin)
在修复过程中遇到了很多小问题。但我在这里提问的主要目标已经达成。所以,我决定提供这个答案,以防其他像我一样的人在这个小失误和逻辑问题上卡住。