webrtc - Asterisk 13.10 + pjsip + WebRTC - Rx 缓冲区溢出 (PJSIP_ERXOVERFLOW)

标签 webrtc asterisk pjsip

经过几天的 pjsip 测试,我终于明白了它是如何工作的。我希望它能帮助我从网站进行 WebRTC 调用。

情况:

  • 我可以使用 Asterisk 调用和接听普通电话
  • 对于 WebRTC,我尝试了 sipml5、Sip.js、JsSIP(当前使用 sipml5)
  • sipml5 连接到我的服务器(已“已连接”)

这是 pjsip“webrtc”配置(目前):

[webrtc]
type=endpoint
transport=transport-udp
context=webrtc
disallow=all
allow=alaw
allow=ulaw
dtls_cert_file=/etc/letsencrypt/live/example.org/fullchain.pem
dtls_private_key=/etc/letsencrypt/live/example.org/privkey.pem
auth=webrtc
aors=webrtc
use_avpf=yes
direct_media=no

[webrtc]
type=aor
contact=sip:webrtc@example.org:5060
max_contacts=1000
outbound_proxy=sip:example.org

[webrtc]
type=auth
auth_type=userpass
username=webrtc
password=psswd
realm=example.org

当我调用电话时出现问题:

[Sep  1 17:50:37] ERROR[7760] pjproject:        sip_endpoint.c Error processing packet from 127.0.0.1:57928: Rx buffer overflow (PJSIP_ERXOVERFLOW)  [code 171062]:
INVITE sip:1@example.org SIP/2.0
Via: SIP/2.0/WSS df7jal23ls0d.invalid;branch=z9hG4bKX7Ng7L0OKRBkpUqGlHPV4GfxO0I7d93i;rport
From: <sip:webrtc@example.org>;tag=ypLlm1BDxPkn8aTTkVJL
To: <sip:1@example.org>
Contact: <sips:webrtc@df7jal23ls0d.invalid;rtcweb-breaker=no;click2call=no;transport=wss>;+g.oma.sip-im;language="en,fr"
Call-ID: 30f526f4-3c4f-e96f-391d-39290b9dc983
CSeq: 60845 INVITE
Content-Type: application/sdp
Content-Length: 3621
Max-Forwards: 70
User-Agent: IM-client/OMA1.0 sipML5-v1.2016.03.04
Organization: Doubango Telecom

v=0
o=- 8456797239022316000 2 IN IP4 127.0.0.1
s=Doubango Telecom - chrome
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS gVGmhQ6UmwynNn99UhRNBJJjcV5AqYkpNF3M
m=audio 47942 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
c=IN IP4 ...
...
a=ice-ufrag:B0dVeWHjfVOT/n0s
a=ice-pwd:BP5DshTjqBa4CqBiZSb8ZpNp
a=fingerprint:sha-256 5B:41:25:27:9E:AD:F2:E9:F2:0A:D6:26:CF:FA:5A:C7:F3:7B:B6:35:32:9A:CF:04:35:2B:07:DB:A1:8F:2E:FD
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=sendrecv
a=rtcp-mux
a=rtpmap:111 opus/48000/2
a=rtcp-fb:111 transport-cc
a=fmtp:111 minptime=10;useinbandfec=1
a=rtpmap:103 ISAC/16000
a=rtpmap:104 ISAC/32000
a=rtpmap:9 G722/8000
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:106 CN/32000
a=rtpmap:105 CN/16000
a=rtpmap:13 CN/8000
a=rtp

为什么会发生这种情况?任务很简单:只需对最简单的 Asterisk 扩展进行 webrtc 调用 (Playback(demo-congrats))

PS:我使用 Nginx 代理 /ws,这就是为什么 Errorprocessing packet from 127.0.0.1:57928 中的 127.0.0.1。

<小时/>

解决:

vim third-party/pjproject/patches/config_site.h
/* #define PJSIP_MAX_PKT_LEN            6000 */
#define PJ_ICE_MAX_CAND 32
#define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16)
#define PJSIP_MAX_PKT_LEN 12288

./configure --with-pjproject-bundled
make
make install

最佳答案

pjsip 具有 WebRTC SDP 可以超过的最大数据包大小。您可以按照以下步骤修复:

  1. 在您的 pjsip 源代码发行版中的 include/pj/ 下查找(或创建)config_site.h
  2. 添加(或设置)以下定义以增加最大消息大小:#define PJSIP_MAX_PKT_LEN 12288。该文件的完整示例可能如下所示:

    #ifndef __PJ_CONFIG_SITE_H__
    #define __PJ_CONFIG_SITE_H__
    
    #define PJ_ICE_MAX_CAND 32
    #define PJ_ICE_MAX_CHECKS (PJ_ICE_MAX_CAND * 16)
    #define PJSIP_MAX_PKT_LEN 12288
    
    #endif /* __PJ_CONFIG_SITE_H__ */
    

    注意:我还为 WebRTC 添加了一些其他合理的设置,以帮助确保您的ice候选者也不会达到限制。

  3. 重新编译pjsip
  4. 重新编译 Asterisk

关于webrtc - Asterisk 13.10 + pjsip + WebRTC - Rx 缓冲区溢出 (PJSIP_ERXOVERFLOW),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39275328/

相关文章:

asterisk - 在 Asterisk AGI 中与我见面

linux - 多次调用时的 Asterisk 性能

iphone - 在iPhone中使用3G来电的Pjsip在UDP中时没有音频

webrtc - 使用 RecordRTC 录制远程 webrtc 流

javascript - webRTC:稍后添加音频或使用 peerJS 禁用麦克风

webrtc - OpenTok WebRTC - 视频流连接错误失败

javascript - iOS getUserMedia 的 Bowser 未定义

sip - 从 Web 应用程序进行自动 SIP 电话调用的最简单方法是什么?

pjsip - 如何将 G.729 编解码器与 PJSIP 项目集成

asterisk - 如何在 pjsip 和 Asterisk 13 中允许入站调用?