我成功地使用 Kurento 的RtpEndpoint
类型连接到多个 Asterisk SIP 服务器以及直接连接到多个型号的 SIP 电话,但是与 Avaya SIP 服务器的连接不起作用,我试图找出原因。症状是已建立连接但没有媒体。
对于 RTP 端点,Kurento 生成以下 SDP(我将其包含公共 IP 地址并删除视频部分),然后将其包含在 SIP 中INVITE
:
v=0
o=- 3807878922 3807878922 IN IP4 192.0.2.95
s=Kurento Media Server
c=IN IP4 192.0.2.95
t=0 0
m=audio 18848 RTP/AVPF 96 0 97
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:96 opus/48000/2
a=rtpmap:97 AMR/8000
a=rtcp:18849
a=sendrecv
a=mid:audio0
a=ssrc:2835743000 cname:user3268188862@host-ad591d54
与 Asterisk 服务器的工作连接将以下 SDP 返回给 Kurento:
v=0
o=root 55778749 55778749 IN IP4 198.51.100.252
s=Asterisk PBX 13.28.1
c=IN IP4 198.51.100.252
t=0 0
m=audio 11704 RTP/AVPF 0
a=rtpmap:0 PCMU/8000
a=maxptime:150
a=sendrecv
在 Kurento 日志中,我看到它说它正在转码此连接。
与 Avaya 服务器的非工作连接将以下 SDP 返回给 Kurento:
v=0
o=- 1598890119 2 IN IP4 203.0.113.100
s=-
c=IN IP4 0.0.0.0
b=AS:64
t=0 0
m=audio 0 RTP/AVP 96 0 97
a=inactive
a=rtpmap:96 opus/48000/2
a=rtpmap:97 AMR/8000
a=ptime:20
如您所见,Avaya 服务器响应它不能使用任何可用的编解码器,因此不会发送或接收媒体 ( a=inactive
)。
根据我发现的一些 Avaya 文档,Avaya SBCE 至少支持以下编解码器的转码:
- OPUS 12kbps 窄带
- OPUS 16kbps 窄带
- OPUS 18kbps 宽带
- G.722
- G.711法律
- G.711法律
- G.726
- G.729AB
Kurento 支持使用 PCMU(又名 G.711ulaw),如工作 Asterisk 示例中所示,但 Avaya 似乎拒绝它。(注意:我以前认为它不包含在 SDP 中,但它确实存在0
于m=audio
行中。)我试图让它强制使用 PCMU using rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.PCMU, 8000))
,但这没有帮助。
我的第二个想法是使用rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.OPUS, 18000))
. 当我尝试这个时,它不仅不能在 Avaya 手机上工作,而且由于 Asterisk 使用 PCMU,它也停止了与 Asterisk 的工作。我想过修改 SDP 以将其更改为opus/18000
,但这是不允许的,因为RFC 7587明确指出:
媒体子类型(“opus”)作为编码名称进入 SDP“a=rtpmap” 。"a=rtpmap" 中的 RTP 时钟速率必须为 48000,
通道数必须为 2。
如何让 Kurento 和 Avaya SBCE 在它们之间发送媒体?