【问题标题】:Pepper Live 2-way Audio Streaming ErrorPepper Live 2 路音频流错误
【发布时间】:2018-03-07 15:08:24
【问题描述】:

我正在尝试在 Pepper 的平板电脑和我的 PC 之间建立实时音频通信。我正在使用 Gstreamer 来建立它。从 Pepper 的麦克风到 PC 的音频正常工作,但从我的 PC 到 Pepper 的平板电脑似乎没有音频。我做错了什么?

PC端:

audio_pipeline = Gst.Pipeline('audio_pipeline')

audio_udpsrc = Gst.ElementFactory.make('udpsrc', None)
audio_udpsrc.set_property('port', args.audio)

audio_caps = Gst.caps_from_string('application/x-rtp,media=(string)audio, clock-rate=(int)44100, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)1, channel-positions=(int)1, payload=(int)96')
audio_filter = Gst.ElementFactory.make('capsfilter', None)
audio_filter.set_property('caps',audio_caps)

audio_depay = Gst.ElementFactory.make('rtpL16depay', None)
audio_convert = Gst.ElementFactory.make('audioconvert', None)

audio_sink = Gst.ElementFactory.make('alsasink', None)
audio_sink.set_property('sync',False)

audio_pipeline.add(audio_udpsrc,audio_filter,audio_depay,audio_convert,audio_sink)
audio_udpsrc.link(audio_filter)
audio_filter.link(audio_depay)
audio_depay.link(audio_convert)
audio_convert.link(audio_sink)

机器人端(编舞):

audio_src = gst.element_factory_make('autoaudiosrc')

audio_convert = gst.element_factory_make('audioconvert')
audio_caps = gst.caps_from_string('audio/x-raw-int,channels=1,depth=16,width=16,rate=44100')
audio_filter = gst.element_factory_make('capsfilter')
audio_filter.set_property('caps',audio_caps)
# audio_enc = gst.element_factory_make('mad')
audio_pay = gst.element_factory_make('rtpL16pay')
audio_udp = gst.element_factory_make('udpsink')
audio_udp.set_property('host',user_ip)
audio_udp.set_property('port',int(user_audio_port))

self.audio_pipeline.add(audio_src,audio_convert,audio_filter,audio_pay,audio_udp)
gst.element_link_many(audio_src,audio_convert,audio_filter,audio_pay,audio_udp)

机器人端(Python SDK):

GObject.threads_init()
Gst.init(None)

audio_pipeline = Gst.Pipeline('audio_pipeline')

audio_src = Gst.ElementFactory.make('autoaudiosrc')

audio_convert = Gst.ElementFactory.make('audioconvert')
audio_caps = Gst.ElementFactory.make('audio/x-raw-int,channels=2,depth=16,width=16,rate=44100')
audio_filter = Gst.ElementFactory.make('capsfilter')
audio_filter.set_property('caps',audio_caps)
audio_pay = Gst.ElementFactory.make('rtpL16pay')
audio_udp = Gst.ElementFactory.make('udpsink')
audio_udp.set_property('host',user_ip)
audio_udp.set_property('port',int(user_audio_port))

audio_pipeline.add(audio_src,audio_convert,audio_filter,audio_pay,audio_udp)
audio_src.link(audio_convert)
audio_convert.link(audio_filter)
audio_filter.link(audio_pay)
audio_pay.link(audio_udp)

audio_pipeline.set_state(Gst.State.PLAYING)

给 Pepper 的电脑麦克风:

audio_port = 80

s_audio_pipeline = Gst.Pipeline('s_audio_pipeline')

s_audio_src = Gst.ElementFactory.make('autoaudiosrc')

s_audio_convert = Gst.ElementFactory.make('audioconvert')
s_audio_caps = Gst.ElementFactory.make('audio/x-raw-int,channels=2,depth=16,width=16,rate=44100')
s_audio_filter = Gst.ElementFactory.make('capsfilter')
s_audio_filter.set_property('caps',audio_caps)
s_audio_pay = Gst.ElementFactory.make('rtpL16pay')
s_audio_udp = Gst.ElementFactory.make('udpsink')
s_audio_udp.set_property('host',ip)
s_audio_udp.set_property('port',int(audio_port))

s_audio_pipeline.add(s_audio_src,s_audio_convert,s_audio_filter,s_audio_pay,s_audio_udp)
s_audio_src.link(s_audio_convert)
s_audio_convert.link(s_audio_filter)
s_audio_filter.link(s_audio_pay)
s_audio_pay.link(s_audio_udp)

胡椒接收:

audio = 80

    r_audio_pipeline = Gst.Pipeline('r_audio_pipeline')

    #defining audio pipeline attributes
    r_audio_udpsrc = Gst.ElementFactory.make('udpsrc', None)
    r_audio_udpsrc.set_property('port', audio)

    r_audio_caps = Gst.caps_from_string('application/x-rtp,media=(string)audio, clock-rate=(int)44100, width=16, height=16, encoding-name=(string)L16, encoding-params=(string)1, channels=(int)2, format=(string)S16LE, channel-positions=(int)1, payload=(int)96')
    r_audio_filter = Gst.ElementFactory.make('capsfilter', None)
    r_audio_filter.set_property('caps',r_audio_caps)

    r_audio_depay = Gst.ElementFactory.make('rtpL16depay', None)
    r_audio_convert = Gst.ElementFactory.make('audioconvert', None)

    r_audio_sink = Gst.ElementFactory.make('alsasink', None)
    r_audio_sink.set_property('sync',False)

    #linking the various attributes
    r_audio_pipeline.add(r_audio_udpsrc,r_audio_filter,r_audio_depay,r_audio_convert,r_audio_sink)
    r_audio_udpsrc.link(r_audio_filter)
    r_audio_filter.link(r_audio_depay)
    r_audio_depay.link(r_audio_convert)
    r_audio_convert.link(r_audio_sink)

    r_audio_pipeline.set_state(Gst.State.PLAYING)

我认为辣椒的接收端口号可能有问题...我尝试了不同的端口号(包括 9559),但似乎没有任何效果。源ID错了吗?

是否可以在同一管道中运行 2-way 流?

我查看了 ffmpeg 和 PyAudio 等其他库,但我没有任何实时流媒体的方法。

【问题讨论】:

  • 从pc端,你能确认你正在接收端口上的数据吗? (下面的管道应该告诉你 gst-launch-1.0 -v udpsrc port=xxxx ! fakesink dump=true )
  • 这是我的输出:gst-launch-1.0 -v udpsrc port=10001 ! fakesink dump=true 将管道设置为 PAUSED ... 管道处于活动状态,不需要 PREROLL ... 将管道设置为 PLAYING ... 新时钟:GstSystemClock
  • 它是否进一步打印了任何东西(它应该打印缓冲区数据)?如果它没有打印缓冲区数据,请查看您的网络是否阻止它,计算机上的防火墙设置也是如此,为了避免您的应用程序问题,可以尝试从发件人 gst-launch-1.0 -v audiotestsrc 发送管道!音频转换! rtpL16pay ! udpsink clients="xxx.xxx.xx.xxx:xxx"
  • 如果防火墙阻止了它,我也不应该得到视频流对吗?我收到的视频没有问题...
  • 是的,它应该阻塞,它是否在同一端口和同一网络上的同一台机器上?您是否尝试使用我之前发布的帖子发送?

标签: python gstreamer nao-robot python-gstreamer pepper


【解决方案1】:

确保在机器人上运行 Python 脚本。

另外,您是否运行了 GMainLoop ?

编排行为在 NAOqi 中运行,NAOqi 已经在后台运行 GMainLoop。也许这是您的独立脚本中缺少的内容。

最后,您没有在 sn-ps 中显示任何旨在将 PC 的音频传输到网络或从网络传输到 Pepper 的扬声器的代码。

【讨论】:

  • 我为对方编辑了代码。您认为选择端口或源 ID 可能有问题吗?
  • 好的。我不确定出了什么问题,或者您提到的“源 ID”是什么,但是您可以尝试在双方都具有相同的功能,并明确主机地址以进行侦听
猜你喜欢
  • 2021-03-10
  • 2012-08-11
  • 1970-01-01
  • 2013-10-12
  • 2018-04-13
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
相关资源
最近更新 更多