java - Android:通过 RTP (G.711 PCMU) 将 .wav 发送到 SIP 电话,基于 SipDroid/MjSIP,声音非常嘈杂、噼啪作响

标签 java android audio rtp mjsip

我想将 .wav 文件从我的 Android 设备传输(仅发送)到软件电话 (x-lite),以便 x-lite 上的被叫方可以听到 .wav 文件的声音。

场景如下: Android 和 x-lite 都在同一个 WLAN 中,并且都连接到 FreeSwitch。我可以从 Android 手机调用 x-lite。如果 x-lite 上接受调用,android 会发送 .wav 文件,我可以在wireshark 中看到 RTP 数据包(G.711 PCMU)从手机发送到 x-lite。我能听到一些声音,但不是我期望的声音。相反,它发出噼啪声、嘈杂声和一些嘟嘟声。

那么我发送给 x-lite 的 SDP 是否有问题?

v=0
o=sip:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6150515153215058534f5057594f534f505051" rel="noreferrer noopener nofollow">[email protected]</a> 0 0 IN IP4 192.168.2.100
s=MySession
c=IN IP4 192.168.2.110
t=0 0
m=audio 8000 RTP/AVP 0 8 101
a=rtpmap:101 telephone-event/8000

或者是我发送 .wav 的方式有问题?

DatagramSocket socket = null;
RtpStreamSender sender = null;
int port =8000;
int payload_type = 0;
int frameSize = 64;
int frameRate =32; 
socket = new DatagramSocket(port);
FileInputStream audioInput = new FileInputStream(f); //f is the .wav
sender = new RtpStreamSender(audioInput, true, payload_type, frameRate, frameSize, remoteAddress, remotePort);
sender.setSyncAdj(2);
sender.start();

如果我在 Wireshark 中跟踪 UDP 流,开头看起来像这样:

........M...RIFF....WAVEfmt ........D...........data0...............................M..........................................................................>M..........................................................................]M..........................................................................|M..................... ....................... ..... .......................M........... ......................... .....................................M........................................................... ...............M............................................... .......+...5...8...........M...6...+.'...-...(.....#...-...+... ........................... ...........M...................................................................... ...6M......... ... ............................................................UM...........-...1...0...,...)...'...0...?...=.#.'.$. .!....................tM.............................$....................... .....&.......... ....M........................... ...................................,...........M...=...I...W...J.../.....................#...<...T...Z...B.................M.....#...5...5......................"... ..... .......5.W.L...N...........M...C...8.m.'.R...>...O...p...~...e...I...3................................M................................................... .......................M... ...5...R...L...3.../...B...Z...b......X...B...!.........{............MM.........$...2...(........................................................lM...............................-.!.R.J.].s.Z.t.U.c.b..q.v.....y...........M...h...V...Y...c...l.f.E.*.............................(...E...X...........M...J...5.H.7.5.^...~...j.................(.=.h.........F.....Q...(.........M.....E.X...{...L.2...............:.......Q.......v........... .............M.................0...S...K...7.+.B.....................&...O...]...........M...r.B.......w...8.Q...?...A...>...................).../.

所以我猜它不是空的。信号开始后,一些信号从 x-lite 发送到 android,然后再次从 android 发送一些数据包到 x-lite...等等

有人可以告诉我为什么我听不到声音吗?

(也欢迎其他解决方案) 编辑:

这是来自 MjSip 的 RTPStramSender 的实现:http://pastebin.com/xU4EdEex

编辑2: 我将 RFC 中的 SDP 更改为:

     m=audio 54874 RTP/AVP 96 97 0 8
     a=rtpmap:96 PCMU-WB/16000
     a=rtpmap:97 PCMA-WB/16000
     a=rtpmap:0 PCMU/8000
     a=rtpmap:8 PCMA/8000

但是什么也没发生。我更改了帧大小和帧速率,但噼啪声只会变得更快或更慢

编辑3: RtpPacket的实现: http://pastebin.com/tDLr5CYF

最佳答案

我怀疑是打包。

此 RFC 告诉您应该如何完成: RFC 5391

事实证明,这有一点帮助,但不是全部。如果有人可以提供帮助并且有效,请接受他的答案而不是我的答案。

关于java - Android:通过 RTP (G.711 PCMU) 将 .wav 发送到 SIP 电话,基于 SipDroid/MjSIP,声音非常嘈杂、噼啪作响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18257438/

相关文章:

java - 当特定 Spring 配置文件处于 Activity 状态时,如何防止运行测试?

java - 如何交换数组中最大的数字和最后一个数字?

java - 解析来自 .Net 网络服务的 JSON 响应

actionscript-3 - ActionScript 3 Flash CS6-淡出音频

java - 如何指定正确的音频格式来从麦克风捕获音频?

java - SAX 解析器具有相似的父标签和子标签

java - 查找可能的 ServerSocket 列表

java - 在 PreferenceActivity 中使用 getSupportFragmentManager

java - 对象创建时的 HandlerThread 同步

ruby-on-rails - 如何使用Rails读取音频文件信息,我想读取音频文件的总持续时间(以秒为单位)