javascript - 使用 JSSIP/WebRTC 的 SIP 调用启动延迟 40 秒

标签 javascript webrtc sip voip jssip

我正在开发一个与 Asterisk SIP 服务器通信的基于 JavaScript 的 Web SIP 客户端。

SIP 客户端使用的是 JSSIP 3.4.2,我正在 Chrome 版本 80 上进行测试。

SIP 客户端和 SIP 服务器都在防火墙后面。我正在使用 STUN 服务器 stun.l.google.com:19302

调用建立良好,但在调用“调用”方法和建立调用(开始 RTP session )之间有 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);

调用发起代码如下:

// 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);

我设置了每个 SIP 事件的日志记录,发现延迟与 onicegatheringstatechangeonicecandidate 事件有关。

这是 Wireshark 日志:

enter image description here

每 10 秒发送一次 STUN 请求,然后是即时响应。这种情况发生了 4 次。

这是我得到的浏览器控制台日志:

enter image description here

我正在打电话的计算机有多个网络接口(interface)。我看到包含两个 IP 地址的 icecandidate 事件,其中一个 (169.254.128.100) 与以太网相关但未使用,另一个 (192.168.1.33) 与 WiFi 相关并用于连接到互联网.

enter image description here

我还在浏览器控制台日志中看到,在发起调用后的几毫秒内收到了 STUN 响应。但在那之后,JSSIP 等待了 40 秒!

enter image description here

如何避免这 40 秒的延迟?

最佳答案

收集候选者的时间可能会很长,通常延迟较大时,最后一个冰候选者会找不到。

为了解决您的延迟,您可以控制超时并在您决定时中止。这是 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);
}

关于javascript - 使用 JSSIP/WebRTC 的 SIP 调用启动延迟 40 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61253322/

相关文章:

android - 如何使用开放 VPN 绕过受阻网络中的 sip 或 rtp voip 流量?

javascript - 合并具有公共(public)元素和多个数据点的数组

android - 如何检测Android H.264硬件加速能力

javascript - 是否可以在浏览器中更改 Javascript 文件中的变量?

android - 桌面和移动应用程序之间的点对点

video-streaming - 如何使用媒体源扩展 (MSE) 低延迟模式

sip - 在SIP INVITE中,为什么ACK被称为事务

java - JAIN-SIP RINGING 响应从未发送

javascript - CoffeeScript 中的测试对象相等性?

javascript - 循环后按钮响应