почему gst.Element.get_request_pad (self.filter, 'filter') 'возвращает' None '(gstreamer | python) - PullRequest
1 голос
/ 29 сентября 2011

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

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

Вот код для стороны приемника "receive.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 «по запросу».

PS: Пожалуйста, используйте код для ссылки на синтаксис и логику, которые я использовал для получения «раковины1»

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

1 Ответ

0 голосов
/ 30 сентября 2011

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

Я забыл помнить, что я должен использовать '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

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

Я заменил / изменил источник 'receive.py'.file:

@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)

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

...