如何将WebRTC音频从Kurento发送到Avaya手机

问题描述

我已成功使用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服务器,并允许它与双方分别进行协商。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...