如何将 WebRTC 音频从 Kurento 发送到 Avaya 手机
How to send WebRTC audio from Kurento to Avaya phones
我成功地使用 Kurento 的 RtpEndpoint
类型连接到多个 Asterisk SIP 服务器以及直接连接到多个 SIP 模型 phone,但是无法连接到 Avaya SIP 服务器,而且我我想弄清楚为什么。症状是连接上了但是没有媒体。
对于 RTP 端点,Kurento 生成以下 SDP(我将其包含 public 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 服务器的工作连接 returns 以下 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 服务器的非工作连接 returns 以下 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 (a.k.a.G.711ulaw),如工作 Asterisk 示例所示,但 Avaya 似乎拒绝它。 (注意:我以前认为它没有包含在 SDP 中,但它作为 m=audio
行中的 0
存在。)我试图使用 [=18 强制使用 PCMU =],但这并没有帮助。
我的第二个想法是使用 rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.OPUS, 18000))
更改 OPUS 比特率。当我尝试这个时,它不仅不能与 Avaya phones 一起工作,而且它也停止与 Asterisk 一起工作,因为 Asterisk 使用 PCMU。我想修改 SDP 以将其更改为 opus/18000
,但这是不允许的,因为 RFC 7587 明确指出:
The media subtype ("opus") goes in SDP "a=rtpmap" as the encoding
name. The RTP clock rate in "a=rtpmap" MUST be 48000, and the
number of channels MUST be 2.
如何让 Kurento 和 Avaya SBCE 在它们之间发送媒体?
最后,我唯一能让它工作的方法是在它们之间放置一个 Kamailio/RTPEngine 服务器,并允许它与双方分别协商。
我成功地使用 Kurento 的 RtpEndpoint
类型连接到多个 Asterisk SIP 服务器以及直接连接到多个 SIP 模型 phone,但是无法连接到 Avaya SIP 服务器,而且我我想弄清楚为什么。症状是连接上了但是没有媒体。
对于 RTP 端点,Kurento 生成以下 SDP(我将其包含 public 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 服务器的工作连接 returns 以下 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 服务器的非工作连接 returns 以下 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 (a.k.a.G.711ulaw),如工作 Asterisk 示例所示,但 Avaya 似乎拒绝它。 (注意:我以前认为它没有包含在 SDP 中,但它作为 m=audio
行中的 0
存在。)我试图使用 [=18 强制使用 PCMU =],但这并没有帮助。
我的第二个想法是使用 rtpEndpoint.setAudioFormat(AudioCaps(AudioCodec.OPUS, 18000))
更改 OPUS 比特率。当我尝试这个时,它不仅不能与 Avaya phones 一起工作,而且它也停止与 Asterisk 一起工作,因为 Asterisk 使用 PCMU。我想修改 SDP 以将其更改为 opus/18000
,但这是不允许的,因为 RFC 7587 明确指出:
The media subtype ("opus") goes in SDP "a=rtpmap" as the encoding
name. The RTP clock rate in "a=rtpmap" MUST be 48000, and the
number of channels MUST be 2.
如何让 Kurento 和 Avaya SBCE 在它们之间发送媒体?
最后,我唯一能让它工作的方法是在它们之间放置一个 Kamailio/RTPEngine 服务器,并允许它与双方分别协商。