vma*_*row 1 javascript voip sip webrtc jssip
我正在开发一个与 Asterisk SIP 服务器通信的基于 JavaScript 的 Web SIP 客户端。
SIP 客户端使用的是 JSSIP 3.4.2,我正在 Chrome 80 版上进行测试。
SIP 客户端和 SIP 服务器都在防火墙之后。我正在使用 STUN 服务器stun.l.google.com:19302。
呼叫建立良好,但在调用“呼叫”方法和建立呼叫(启动 RTP 会话)之间有40 秒的延迟。
SIP UA注册代码如下:
// SIP UA registration
var currentUserSipAccount = {
uri: '211',
pwd: 'secret'
};
var sipDomain = 'sip.my-domain.com';
var sipServerUrl = 'wss://' + sipDomain + ':8089/ws';
var socket = new JsSIP.WebSocketInterface(sipServerUrl);
var connectionParams = {};
connectionParams.sockets = [socket];
connectionParams.register = true;
connectionParams.uri = 'sip:' + currentUserSipAccount.uri + '@' + sipDomain;
connectionParams.password = currentUserSipAccount.pwd;
var bwPhone = new JsSIP.UA(connectionParams);
Run Code Online (Sandbox Code Playgroud)
这是呼叫启动的代码:
// SIP call
var callNumber = 'sip:233@' + sipDomain;
var callOptions = {
mediaConstraints: {
audio: true, // only audio calls
video: false
},
pcConfig: {
iceServers: [
{'urls': ['stun:stun.l.google.com:19302']}
]
}
};
bwPhone.call(callNumber, callOptions);
Run Code Online (Sandbox Code Playgroud)
我设置了每个 SIP 事件的日志记录,发现延迟与onicegatheringstatechange和onicecandidate事件有关。
这是 Wireshark 日志:
每 10 秒,发送一个 STUN 请求,然后是即时响应。这种情况发生了 4 次。
这是我得到的浏览器控制台日志:
我正在通话的计算机有多个网络接口。我看到icecandidate事件包含两个IP地址,其中一个(169.254.128.100)与以太网相关,未使用,另一个(192.168.1.33)与WiFi相关,用于连接互联网。
我还在浏览器控制台日志中看到,在启动调用后的几毫秒内收到 STUN 响应。但在那之后,JSSIP 等待 40 秒!
如何避免这 40 秒的延迟?
小智 6
收集候选可能会很长,通常,当延迟很大时,最后一个冰候选将无法找到。
为了解决您的延迟,您可以控制超时并在您决定时中止。这是使用 jssip 超时 5 秒的示例:
var myCandidateTimeout = null;
_session.on('icecandidate', function(candidate, ready) {
console.log('getting a candidate' + candidate.candidate.candidate);
if (myCandidateTimeout!=null)
clearTimeout(myCandidateTimeout);
// 5 seconds timeout after the last icecandidate received!
myCandidateTimeout = setTimeout(candidate.ready, 5000);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1928 次 |
| 最近记录: |