【问题标题】:Playing an rtp stream on android published with gstreamer在使用 gstreamer 发布的 android 上播放 rtp 流
【发布时间】:2018-05-24 23:30:36
【问题描述】:

我正在尝试在台式电脑上的麦克风和安卓智能手机之间建立 rtp 连接。

我使用 gstreamer 获取数据。 因为同一个系统中其他应用同时使用这个麦克风,所以有一个tcpsink,数据就在这个tcpsink中发布。

这是通过这个调用完成的:

gst-launch-0.10 -v alsasrc ! 'audio/x-raw-int, depth=16, width=16, \ 
             endianness=1234, channels=1, rate=16000' ! \ 
             tcpserversink host=localhost port=20000

然后我创建第二个流,它抓取 tcp 连接并将其转换为 rtp 流以通过 udp 发布数据

gst-launch-0.10 tcpclientsrc host=localhost protocol=0 port=20000 ! \
             audio/x-raw-int,depth=16, width=16,endianness=1234, channels=1,\
             rate=16000 ! lamemp3enc target=1 bitrate=64 cbr=true ! mad ! \
             audioconvert ! audioresample ! mulawenc ! rtppcmupay pt=96 ! \
             udpsink host=129.70.134.128 port=6000

这在本地主机上玩 vlc 播放器时有效

vlc rtp://129.70.134.128:6000

现在我将 udpsink 中的主机更改为 android 的手机。这也是它在玩 mplayer 应用程序时所喊的。

在这之后,最后一步应该是用我自己的应用程序播放声音。

我正在尝试使用 android.net.rtp 类获取流。

AudioManager audioManager = (AudioManager);
mContext.getSystemService(mContext.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
AudioStream inRtpStream = new AudioStream(createInet("127.0.0.1"));

inRtpStream.associate(createInet(url), 6000);
inRtpStream.setMode(RtpStream.MODE_RECEIVE_ONLY);  
inRtpStream.setCodec(AudioCodec.PCMU);
inRtpStream.setDtmfType(96);
// Initialize an AudioGroup and attach an AudioStream
AudioGroup main_grp = new AudioGroup();
main_grp.setMode(AudioGroup.MODE_NORMAL);
inRtpStream.join(main_grp);

但是有沉默。 日志输出让我想到,应用程序正在尝试播放某种数据。

DEBUG   AudioGroup  stream[57] is configured as PCMU 8kHz 20ms mode 2
DEBUG   AudioGroup  stream[64] is configured as RAW 8kHz 32ms mode 0
DEBUG   AudioGroup  stream[64] joins group[63]
DEBUG   AudioGroup  group[63] switches from mode 0 to 2
DEBUG   AudioGroup  stream[57] joins group[63]
DEBUG   AudioGroup  reported frame count: output 1149, input 384
DEBUG   AudioGroup  adjusted frame count: output 1149, input 512
DEBUG   AudioGroup  latency: output 302, input 64

我是否错过了启动流或打开扬声器之类的东西?

所有可用的音量滑块都调到最大。我还在清单文件中请求了 INTERNET 和 RECORD_AUDIO 权限。

编解码器也应该相同。

感谢您的回答

【问题讨论】:

    标签: java android audio-streaming gstreamer rtp


    【解决方案1】:

    您应该在 "new AudioStream(createInet("127.0.0.1"));" 中传入实际 IP 地址,而不是 LOOP BACK ADDRESS 127.0.0.1

    【讨论】:

      【解决方案2】:

      创建音频流时,端口号是随机生成的。您可以通过调用 AudioStream getLocalPort() 函数获得您的 IP + 端口,然后您必须通过 sip 等信令协议或简单地通过 TCP 或 UDP 将您的 IP + 端口发送到其他设备。另一台设备也必须向您发送相同的信息。 一旦您从其他设备获取此数据,您就可以使用您这边的关联功能与远程 IP 和远程端口。 请注意,获取其他设备的 IP 不是必需的,您可以对其进行硬编码,但您不能对端口做任何事情,因为(再次)它是随机生成的。

      干杯

      【讨论】:

        【解决方案3】:

        尝试打开扬声器: audioManager.setSpeakerphoneOn(true);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多