首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在gstreamer发布的android上播放rtp流

在gstreamer发布的android上播放rtp流
EN

Stack Overflow用户
提问于 2013-09-04 22:20:35
回答 3查看 2.9K关注 0票数 0

我正在尝试在桌面pc上的麦克风和android智能手机之间建立rtp连接。

我使用gstreamer获取数据。因为在同一系统中同时使用该麦克风的其他应用程序,所以存在发布数据的tcpsink。

这是通过此调用完成的:

代码语言:javascript
代码运行次数:0
运行
复制
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发布数据

代码语言:javascript
代码运行次数:0
运行
复制
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播放器播放时,这是有效的

代码语言:javascript
代码运行次数:0
运行
复制
vlc rtp://129.70.134.128:6000

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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);

但是这里是沉默的。日志记录输出让我认为,应用程序正在尝试播放某些类型的数据。

代码语言:javascript
代码运行次数:0
运行
复制
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

我是不是错过了一些东西,比如启动流,或者打开扬声器?

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

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

感谢您的回答

EN

回答 3

Stack Overflow用户

发布于 2013-10-11 05:27:43

您应该传入实际的IP地址,而不是在"new AudioStream(createInet(" 127.0.0.1 "));“中返回地址127.0.0.1。

票数 1
EN

Stack Overflow用户

发布于 2013-11-15 16:07:53

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

干杯

票数 1
EN

Stack Overflow用户

发布于 2018-05-13 05:28:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18616406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档