在使用gstreamer发布的android上播放rtp流

时间:2013-09-04 14:20:35

标签: java android audio-streaming gstreamer rtp

我正试图在台式机上的麦克风和Android智能手机之间建立rtp连接。

我使用gstreamer抓取数据。 由于其他应用程序在同一系统中同时使用此麦克风,因此有一个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

这可以在localhost上播放whith 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权限。

编解码器也应该是相同的。

感谢您的回答

3 个答案:

答案 0 :(得分:1)

你应该在“new AudioStream(createInet(”127.0.0.1“))中传入实际的IP地址而不是LOOP BACK ADDRESS 127.0.0.1;”

答案 1 :(得分:1)

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

干杯

答案 2 :(得分:0)

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