почему ‘gst.Element.get_request_pad(self.filter, ‘filter’)’ возвращает ‘None’ (gstreamer | python)

#python #gstreamer

#python #gstreamer

Вопрос:

Я новичок в gstreamer и его разработке. Я пытаюсь смешивать потоки RTP с помощью Gstreamer Python. Клиент отправляет различные источники видеотеста, и смешивание этих потоков должно происходить на стороне получателя с использованием RTP. Это должно быть возможно по крайней мере для четырех участников.

На стороне получателя будет уже связанный с ним videotestbackground, который будет отображаться первым. Когда приемник получит источники видеотеста, тогда должно произойти смешивание источников видеотеста и отображаться на фоновом режиме видеотеста.

Вот код для стороны получателя «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
  

Я не могу понять, почему я получаю «None» по запросу для «sinkpad1». В документации указано, что updsrc sinkpad являются «по запросу».

PS: Пожалуйста, обратитесь к коду для ссылки на синтаксис и логику, которые я использовал для получения ‘sinkpad1’

Я не могу запустить его. Я много боролся, чтобы найти решение. Пожалуйста, кто-нибудь, помогите мне найти логическую ошибку. Заранее спасибо.

Ответ №1:

Вот решение, которое я наконец нашел. 🙂

Я забыл иметь в виду, что я должен использовать ‘rtpbin’, который я получаю от клиента. Свойства Pad ‘gstrtpbin’ ( $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
  

Глядя на приведенные выше свойства панели, я должен использовать панель recv_rtp_sink_%d’, которая доступна только по запросу.

Я заменил / изменил источник ‘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)
  

И много мелких ошибок, когда я продолжаю это исправлять. Но моя главная цель для этого вопроса, опубликованного здесь, выполнена. Итак, я решил предоставить ответ на случай, если другие люди, подобные мне, застрянут на этой глупой халатности и логической проблеме.