问题描述
我已成功使用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.711ulaw
- G.711alaw
- G.726
- G.729AB
Kurento支持使用PCMU(也称为G.711ulaw),如有效的Asterisk示例所示,但Avaya似乎拒绝了它。 (注意:我以前认为它不包含在SDP中,但它在0
行中以m=audio
的形式出现。)我试图使用{{1 }},但这没有帮助。
我的第二个想法是使用rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.PCMU,8000))
更改OPUS比特率。当我尝试此操作时,它不仅不适用于Avaya手机,而且由于Asterisk使用PCMU,因此它也停止与Asterisk一起使用。我曾考虑过将SDP更改为rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.OPUS,18000))
,但这是不允许的,因为RFC 7587明确指出:
媒体子类型(“ opus”)在SDP“ a = rtpmap”中作为编码
名称。 “ a = rtpmap”中的RTP时钟速率必须为48000,并且
通道数必须为2。
如何让Kurento和Avaya SBCE在彼此之间发送媒体?
解决方法
最后,我要使其正常工作的唯一方法是在它们之间放置一个Kamailio / RTPEngine服务器,并允许它与双方分别进行协商。