#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)
И много мелких ошибок, когда я продолжаю это исправлять. Но моя главная цель для этого вопроса, опубликованного здесь, выполнена. Итак, я решил предоставить ответ на случай, если другие люди, подобные мне, застрянут на этой глупой халатности и логической проблеме.