为何'gst.Element.get_request_pad(self.filter, 'filter')'返回'None' (gstreamer | python)

1 投票
1 回答
1284 浏览
提问于 2025-04-17 03:22

我刚接触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)

在修复过程中遇到了很多小问题。但我在这里提问的主要目标已经达成。所以,我决定提供这个答案,以防其他像我一样的人在这个小失误和逻辑问题上卡住。

撰写回答