Hi All,
I 'm struggling with full dublex rtp problem. When I launch two separate pipeline (in same host) like below everything works just fine ( I can hear both sounds wave 5 and wave 1 and with wireshark I can see that rtp packets flows nicely in both directions):
Client A ------------ gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX" port=5000 ! rtpbin.recv_rtp_sink_0 audiotestsrc wave=5 ! audioconvert ! audioresample ! audio/x-raw-int,rate=16000 ! queue leaky=1 ! speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! udpsink port=5002 sync=false async=false rtpbin. ! rtpspeexdepay ! queue leaky=1 ! speexdec ! audioconvert ! audioresample ! autoaudiosink
Client B ------------ gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc caps="application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX" port=5002 ! rtpbin.recv_rtp_sink_0 audiotestsrc wave=1 ! audioconvert ! audioresample ! audio/x-raw-int,rate=16000 ! queue leaky=1 ! speexenc bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 ! udpsink port=5000 sync=false async=false rtpbin. ! rtpspeexdepay ! queue leaky=1 ! speexdec ! audioconvert ! audioresample ! autoaudiosink But some reason version coded with Python doesn't work so well. I can hear only audio sent by one client not both. Any idea what could be wrong in this Python code? Why both sounds cannot be heard?
client-b code is exactly same except port numbers and in 'def go()' line 'print autoaudiosink.set_locked_state(gst.STATE_PLAYING)' is not commented out (i don't know why it have to be like this?).
#!/usr/bin/env python # -=- encoding: utf-8 -=- import gobject, pygst pygst.require("0.10") import gst import gobject
import sys import os import readline # To the laptop that will catch everything REMOTE_HOST = 'localhost' caps = 'application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX'
mainloop = gobject.MainLoop() pipeline = gst.Pipeline('client-a') bus = pipeline.get_bus() # incoming audio stream elements rtpspeexdepay = gst.element_factory_make('rtpspeexdepay')
speexdec = gst.element_factory_make('speexdec') audioconvert1 = gst.element_factory_make('audioconvert') audioconvert2 = gst.element_factory_make('audioconvert')
audioresample = gst.element_factory_make('audioresample') autoaudiosink = gst.element_factory_make('autoaudiosink') queue1 = gst.element_factory_make('queue') #queue1.set_property('leaky', 1)
# outgoing audio stream elements audiotestsrc = gst.element_factory_make('audiotestsrc') audiotestsrc.set_property('wave', 5) audioconvert = gst.element_factory_make('audioconvert')
audioresample = gst.element_factory_make('audioresample') speexenc = gst.element_factory_make('speexenc') speexenc.set_property('bitrate', 16000) rtpspeexpay = gst.element_factory_make('rtpspeexpay')
queue2 = gst.element_factory_make('queue') #queue2.set_property('leaky', 1) # incoming rtp udpsrc_rtpin = gst.element_factory_make('udpsrc', "udpsrc1")
udpsrc_rtpin.set_property('port', 5000) udpsrc_caps = gst.caps_from_string(caps) udpsrc_rtpin.set_property('caps', udpsrc_caps) # outgoing rtp udpsink_rtpout = gst.element_factory_make("udpsink", "udpsink0")
udpsink_rtpout.set_property('host', REMOTE_HOST) udpsink_rtpout.set_property('port', 5002) udpsink_rtpout.set_property('sync', 'false') udpsink_rtpout.set_property('async', 'false')
# incoming and outgoing rtcp #udpsink_rtcpout = gst.element_factory_make("udpsink", "udpsink1") #udpsink_rtcpout.set_property('host', REMOTE_HOST)
#udpsink_rtcpout.set_property('port', 5003) #udpsink_rtcpout.set_property('sync', 'false') #udpsink_rtcpout.set_property('async', 'false') #udpsrc_rtcpin = gst.element_factory_make("udpsrc", "udpsrc0")
#udpsrc_rtcpin.set_property('port', 5007) rtpbin = gst.element_factory_make('gstrtpbin', 'gstrtpbin') # Add elements pipeline.add(rtpbin, udpsrc_rtpin, rtpspeexdepay, speexdec, audioconvert1, queue1, autoaudiosink, audiotestsrc, audioconvert2, audioresample, queue2, speexenc, rtpspeexpay, udpsink_rtpout)
# Link them udpsrc_rtpin.link_pads('src', rtpbin, 'recv_rtp_sink_0') def rtpbin_pad_added(obj, pad): print "PAD ADDED"
print " obj = ", obj print " pad = ", pad print " pad capabilities = ", str(pad.get_property('caps')) rtpbin.link(rtpspeexdepay)
rtpspeexdepay.link(queue1) queue1.link(speexdec) speexdec.link(audioconvert1) audioconvert1.link(autoaudiosink) audiotestsrc.link(audioconvert2)
audioconvert2.link(audioresample) audio_caps = gst.Caps("audio/x-raw-int,rate=16000") audioresample.link_filtered(queue2, audio_caps) queue2.link(speexenc) speexenc.link(rtpspeexpay)
rtpspeexpay.link_pads('src', rtpbin, 'send_rtp_sink_0') rtpbin.link_pads('send_rtp_src_0', udpsink_rtpout, 'sink') rtpbin.connect('pad-added', rtpbin_pad_added)
def go(): #print "Setting locked state for autovideosink and udpsink" #print udpsink_rtcpout.set_locked_state(gst.STATE_PLAYING) #print autoaudiosink.set_locked_state(gst.STATE_PLAYING)
print "Setting pipeline to PLAYING" print pipeline.set_state(gst.STATE_PLAYING) print "Waiting pipeline to settle" print pipeline.get_state()
#print "Final caps writte to", WRITE_AUDIO_CAPS #open(WRITE_AUDIO_CAPS, 'w').write(str(udpsink_rtpout.get_pad('sink').get_property('caps'))) print "audio stream caps = ", str(udpsink_rtpout.get_pad('sink').get_property('caps'))
mainloop.run() go() Thanks in advance! Thanks & Regards, Tommi Roth _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Hi Tommi,
Try saving yourself effort and replace everything between lines # incoming audio stream elements and def go(): with a single call parse_bin_from_description() and see if this works. Kris On 05/12/12 12:39, tommi roth wrote: > Hi All, > > I 'm struggling with full dublex rtp problem. > > When I launch two separate pipeline (in same host) like below everything > works just fine ( I can hear both sounds wave 5 and wave 1 and with > wireshark I can see that rtp packets flows nicely in both directions): > > Client A > ------------ > gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc > caps="application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX" > port=5000 ! rtpbin.recv_rtp_sink_0 audiotestsrc wave=5 ! audioconvert ! > audioresample ! audio/x-raw-int,rate=16000 ! queue leaky=1 ! speexenc > bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 > ! udpsink port=5002 sync=false async=false rtpbin. ! rtpspeexdepay ! queue > leaky=1 ! speexdec ! audioconvert ! audioresample ! autoaudiosink > > > Client B > ------------ > gst-launch-0.10 -v gstrtpbin name=rtpbin udpsrc > caps="application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX" > port=5002 ! rtpbin.recv_rtp_sink_0 audiotestsrc wave=1 ! audioconvert ! > audioresample ! audio/x-raw-int,rate=16000 ! queue leaky=1 ! speexenc > bitrate=16000 ! rtpspeexpay ! rtpbin.send_rtp_sink_0 rtpbin.send_rtp_src_0 > ! udpsink port=5000 sync=false async=false rtpbin. ! rtpspeexdepay ! queue > leaky=1 ! speexdec ! audioconvert ! audioresample ! autoaudiosink > > > But some reason version coded with Python doesn't work so well. I can hear > only audio sent by one client not both. > > Any idea what could be wrong in this Python code? Why both sounds cannot be > heard? > > client-b code is exactly same except port numbers and in 'def go()' line > 'print autoaudiosink.set_locked_state(gst.STATE_PLAYING)' is not commented > out (i don't know why it have to be like this?). > > > #!/usr/bin/env python > # -=- encoding: utf-8 -=- > > import gobject, pygst > pygst.require("0.10") > import gst > import gobject > import sys > import os > import readline > > # To the laptop that will catch everything > REMOTE_HOST = 'localhost' > > caps = > 'application/x-rtp,media=(string)audio,clock-rate=(int)16000,encoding-name=(string)SPEEX' > > mainloop = gobject.MainLoop() > pipeline = gst.Pipeline('client-a') > bus = pipeline.get_bus() > > # incoming audio stream elements > rtpspeexdepay = gst.element_factory_make('rtpspeexdepay') > speexdec = gst.element_factory_make('speexdec') > audioconvert1 = gst.element_factory_make('audioconvert') > audioconvert2 = gst.element_factory_make('audioconvert') > audioresample = gst.element_factory_make('audioresample') > autoaudiosink = gst.element_factory_make('autoaudiosink') > queue1 = gst.element_factory_make('queue') > #queue1.set_property('leaky', 1) > > # outgoing audio stream elements > audiotestsrc = gst.element_factory_make('audiotestsrc') > audiotestsrc.set_property('wave', 5) > audioconvert = gst.element_factory_make('audioconvert') > audioresample = gst.element_factory_make('audioresample') > speexenc = gst.element_factory_make('speexenc') > speexenc.set_property('bitrate', 16000) > rtpspeexpay = gst.element_factory_make('rtpspeexpay') > queue2 = gst.element_factory_make('queue') > #queue2.set_property('leaky', 1) > > # incoming rtp > udpsrc_rtpin = gst.element_factory_make('udpsrc', "udpsrc1") > udpsrc_rtpin.set_property('port', 5000) > udpsrc_caps = gst.caps_from_string(caps) > udpsrc_rtpin.set_property('caps', udpsrc_caps) > > # outgoing rtp > udpsink_rtpout = gst.element_factory_make("udpsink", "udpsink0") > udpsink_rtpout.set_property('host', REMOTE_HOST) > udpsink_rtpout.set_property('port', 5002) > udpsink_rtpout.set_property('sync', 'false') > udpsink_rtpout.set_property('async', 'false') > > # incoming and outgoing rtcp > #udpsink_rtcpout = gst.element_factory_make("udpsink", "udpsink1") > #udpsink_rtcpout.set_property('host', REMOTE_HOST) > #udpsink_rtcpout.set_property('port', 5003) > #udpsink_rtcpout.set_property('sync', 'false') > #udpsink_rtcpout.set_property('async', 'false') > #udpsrc_rtcpin = gst.element_factory_make("udpsrc", "udpsrc0") > #udpsrc_rtcpin.set_property('port', 5007) > > rtpbin = gst.element_factory_make('gstrtpbin', 'gstrtpbin') > > # Add elements > pipeline.add(rtpbin, udpsrc_rtpin, rtpspeexdepay, speexdec, audioconvert1, > queue1, autoaudiosink, audiotestsrc, audioconvert2, audioresample, queue2, > speexenc, rtpspeexpay, udpsink_rtpout) > > # Link them > udpsrc_rtpin.link_pads('src', rtpbin, 'recv_rtp_sink_0') > > def rtpbin_pad_added(obj, pad): > print "PAD ADDED" > print " obj = ", obj > print " pad = ", pad > print " pad capabilities = ", str(pad.get_property('caps')) > rtpbin.link(rtpspeexdepay) > > rtpspeexdepay.link(queue1) > queue1.link(speexdec) > speexdec.link(audioconvert1) > audioconvert1.link(autoaudiosink) > > audiotestsrc.link(audioconvert2) > audioconvert2.link(audioresample) > audio_caps = gst.Caps("audio/x-raw-int,rate=16000") > audioresample.link_filtered(queue2, audio_caps) > queue2.link(speexenc) > speexenc.link(rtpspeexpay) > > rtpspeexpay.link_pads('src', rtpbin, 'send_rtp_sink_0') > rtpbin.link_pads('send_rtp_src_0', udpsink_rtpout, 'sink') > > rtpbin.connect('pad-added', rtpbin_pad_added) > > def go(): > #print "Setting locked state for autovideosink and udpsink" > #print udpsink_rtcpout.set_locked_state(gst.STATE_PLAYING) > #print autoaudiosink.set_locked_state(gst.STATE_PLAYING) > print "Setting pipeline to PLAYING" > print pipeline.set_state(gst.STATE_PLAYING) > print "Waiting pipeline to settle" > print pipeline.get_state() > #print "Final caps writte to", WRITE_AUDIO_CAPS > #open(WRITE_AUDIO_CAPS, > 'w').write(str(udpsink_rtpout.get_pad('sink').get_property('caps'))) > print "audio stream caps = ", > str(udpsink_rtpout.get_pad('sink').get_property('caps')) > mainloop.run() > > go() > > > Thanks in advance! > > Thanks & Regards, > Tommi Roth > > > > _______________________________________________ > gstreamer-devel mailing list > [hidden email] > http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel > _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |