【发布时间】:2018-04-05 22:56:11
【问题描述】:
我一直在与我的计算机在同一 LAN 上使用 Asterisk 服务器 (v13.18) 试验 WebRTC。我将 Asterisk 扩展 6003 配置为在拨号时自动应答并播放某个臭名昭著的声音文件,然后确认这适用于 Ekiga 软电话客户端。
然后我可以通过以下步骤在 Firefox 中正常工作:
- 开通在线演示站点https://www.doubango.org/sipml5/call.htm?svn=252
- 打开专家模式屏幕
- 选中“禁用视频”复选框。
- 在“ICE 服务器”字段中输入
[](因为我在本地 LAN 上,不涉及 NAT,我不需要 STUN 或 TURN,尽管我在 Asterisk 配置中启用了 ICE)李> - 输入了我的“Websocket 服务器 URL”值
wss://asterisk-ci.test:8089/ws - 点击保存,然后返回演示页面。
- 在演示页面的“注册”部分输入星号服务器信息并单击“登录”,确认显示状态为“已连接”。
- 在“呼叫控制”框中输入分机号6003,点击“呼叫”。
在 Firefox 中这很有效 - 声音文件通过通话播放给我。
在 Google Chrome(最新 v65)中,实际上没有声音播放,但除此之外,一切似乎都应该正常工作。特别是:
- sipML5 客户端显示“通话中”,UI 显示通话处于活动状态。
- Javascript 控制台中没有错误。
- “网络”选项卡中的 Websocket 帧中的 SIP 流量看起来不错,似乎与 Firefox 正在执行的操作相匹配。
-
chrome://webrtc-internals页面表明有大量流量进入。特别是,音频通道上的数据图表与此处显示的声音文件一致。
我尝试使用SIP.js 设置示例应用程序并得到完全相同的结果,确认这不是sipML5 的问题,而是我的Asterisk 配置以及它如何与Google Chrome 交互的问题。
我通过asterisk -vvvvvr 连接到 Asterisk 以查看可能会显示哪些调试消息,并且工作的 Firefox 和不工作的 Chrome 之间似乎确实存在一些显着差异。以下是我在 Firefox 中连接然后拨打电话时看到的内容:
== WebSocket connection from '192.168.99.123:40190' for protocol 'sip' accepted using version '13'
-- Registered SIP '1061' at 192.168.99.123:40190
== DTLS ECDH initialized (automatic), faster PFS enabled
== Using SIP RTP CoS mark 5
> 0x7f79f800dba0 -- Strict RTP learning after remote address set to: 192.168.99.123:32807
-- Executing [6003@users:1] Answer("SIP/1061-00000007", "") in new stack
> 0x7f79f800dba0 -- Strict RTP learning after ICE completion
> 0x7f79f800dba0 -- Strict RTP switching to RTP target address 192.168.99.123:32807 as source
-- Executing [6003@users:2] Playback("SIP/1061-00000007", "auto-playback") in new stack
-- <SIP/1061-00000007> Playing 'auto-playback.slin' (language 'en')
> 0x7f79f800dba0 -- Strict RTP learning complete - Locking on source address 192.168.99.123:32807
-- Executing [6003@users:3] Hangup("SIP/1061-00000006", "") in new stack
但是当我在谷歌浏览器上连接时,我得到了一个非常不同的结果:
== WebSocket connection from '192.168.99.123:52868' for protocol 'sip' accepted using version '13'
-- Registered SIP '1061' at 192.168.99.123:52868
== DTLS ECDH initialized (automatic), faster PFS enabled
== Using SIP RTP CoS mark 5
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 127.0.0.1:9
-- Executing [6003@users:1] Answer("SIP/1061-00000008", "") in new stack
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303
-- Executing [6003@users:2] Playback("SIP/1061-00000008", "auto-playback") in new stack
-- <SIP/1061-00000008> Playing 'auto-playback.slin' (language 'en')
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303
> 0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303
然后消息0x7f79fc00c710 -- Strict RTP learning after remote address set to: 192.168.99.123:39303 在通话期间无限重复。
除了该消息重复之外,我注意到在 Firefox 上,原始的“严格 RTP 学习”消息具有正确的地址,而在 Google Chrome 上是 127.0.0.1:9。 127.0.0.1 和端口9 的使用都很有趣,尽管我不知道要做什么。谷歌浏览器是否会以与 Asterisk 混淆的方式隐藏您的 IP 地址?
有趣的是,当我使用 SIP.js 示例尝试相同的操作时,我得到完全相同的结果(在 Firefox 上工作,连接但在 Chrome 上没有声音)在 Asterisk 中具有相同的调试输出,除了初始地址是0.0.0.0:9 而不是 127.0.0.1:9。
尽管我不确定下一步要尝试什么,所以我们将不胜感激。
编辑:按照建议,我将发布 SDP 日志。以下是我为正常工作的 Firefox 获得的信息:
Local SDP (Offer)
v=0
o=mozilla...THIS_IS_SDPARTA-59.0.2 7697709853700369104 0 IN IP4 0.0.0.0
s=-
t=0 0
a=sendrecv
a=fingerprint:sha-256 BD:03:D7:1A:FB:F7:A3:BE:D0:F9:22:65:80:7B:FE:78:1C:17:01:17:99:57:A4:40:49:0D:EF:AA:AA:91:63:2C
a=group:BUNDLE sdparta_0
a=ice-options:trickle
a=msid-semantic:WMS *
m=audio 52547 UDP/TLS/RTP/SAVPF 109 9 0 8 101
c=IN IP4 192.168.99.123
a=candidate:0 1 UDP 2122252543 192.168.99.123 52547 typ host
a=candidate:1 1 TCP 2105524479 192.168.99.123 9 typ host tcptype active
a=candidate:0 2 UDP 2122252542 192.168.99.123 33797 typ host
a=candidate:1 2 TCP 2105524478 192.168.99.123 9 typ host tcptype active
a=sendrecv
a=end-of-candidates
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
a=extmap:2 urn:ietf:params:rtp-hdrext:sdes:mid
a=fmtp:109 maxplaybackrate=48000;stereo=1;useinbandfec=1
a=fmtp:101 0-15
a=ice-pwd:63350c71006d1daf78366efc8d05347f
a=ice-ufrag:e92ccf7b
a=mid:sdparta_0
a=msid:{8a0a921d-b591-41b5-94e7-647b9b40cd06} {78e4a3a8-628f-4e09-a05a-fa6edb3022be}
a=rtcp:33797 IN IP4 192.168.99.123
a=rtcp-mux
a=rtpmap:109 opus/48000/2
a=rtpmap:9 G722/8000/1
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=setup:actpass
a=ssrc:1153204890 cname:{9de8930f-bf76-48e0-a9c9-4c15f6914409}
Remote SDP (Answer)
v=0
o=root 477460967 477460967 IN IP4 172.30.8.8
s=-
t=0 0
a=sendrecv
m=audio 18666 RTP/SAVPF 0 8 101
c=IN IP4 172.30.8.8
a=candidate:Hac1e0808 1 UDP 2130706431 172.30.8.8 18666 typ host
a=candidate:Hac1e0808 2 UDP 2130706430 172.30.8.8 18667 typ host
a=sendrecv
a=fingerprint:sha-256 75:D2:BE:77:B6:8E:1B:4E:F9:BF:FB:34:54:2D:05:31:F6:97:C5:34:F3:D9:65:BE:FC:C6:E4:5C:1A:5E:11:E7
a=fmtp:101 0-16
a=ice-pwd:1e0f3ac370cce57d7c978ecb57ae23d9
a=ice-ufrag:7189ea580175062f339a9fe84ed6ecae
a=maxptime:150
a=rtcp-mux
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=setup:active
这是我从无法工作的 Chrome 中看到的,它看起来也像 SDP,但看起来与我大不相同,例如甚至在任何输出中都看不到我的 IP 地址:
> createOfferOnSuccess
type: offer, sdp: v=0
o=- 3202047122122577027 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:kQT+
a=ice-pwd:6BgMZ48o3m7PMPFXY7AZvfdb
a=ice-options:trickle
a=fingerprint:sha-256 59:9F:B3:53:89:64:3A:3F:03:1B:32:8F:97:9B:6E:A1:33:B8:05:DD:92:87:3C:1C:CA:A3:83:28:8D:2C:98:FE
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
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=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:3990625320 cname:R43Nh5Jptx9sDbOE
a=ssrc:3990625320 msid:C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU c42217e8-19c2-4d94-a392-d4166d00eb22
a=ssrc:3990625320 mslabel:C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU
a=ssrc:3990625320 label:c42217e8-19c2-4d94-a392-d4166d00eb22
> setLocalDescription
type: offer, sdp: v=0
o=- 3202047122122577027 2 IN IP4 127.0.0.1
s=-
t=0 0
a=group:BUNDLE audio
a=msid-semantic: WMS C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU
m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126
c=IN IP4 0.0.0.0
a=rtcp:9 IN IP4 0.0.0.0
a=ice-ufrag:kQT+
a=ice-pwd:6BgMZ48o3m7PMPFXY7AZvfdb
a=ice-options:trickle
a=fingerprint:sha-256 59:9F:B3:53:89:64:3A:3F:03:1B:32:8F:97:9B:6E:A1:33:B8:05:DD:92:87:3C:1C:CA:A3:83:28:8D:2C:98:FE
a=setup:actpass
a=mid:audio
a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
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=rtpmap:110 telephone-event/48000
a=rtpmap:112 telephone-event/32000
a=rtpmap:113 telephone-event/16000
a=rtpmap:126 telephone-event/8000
a=ssrc:3990625320 cname:R43Nh5Jptx9sDbOE
a=ssrc:3990625320 msid:C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU c42217e8-19c2-4d94-a392-d4166d00eb22
a=ssrc:3990625320 mslabel:C0FThsSoaGKxFOoR8Fnptw8vJWdbuN4K2DeU
a=ssrc:3990625320 label:c42217e8-19c2-4d94-a392-d4166d00eb22
> setRemoteDescription
type: answer, sdp: v=0
o=root 2070370846 2070370846 IN IP4 172.30.8.8
s=Asterisk PBX certified/13.18-cert2
c=IN IP4 172.30.8.8
t=0 0
m=audio 13528 RTP/SAVPF 0 8 126
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
a=rtpmap:126 telephone-event/8000
a=fmtp:126 0-16
a=maxptime:150
a=ice-ufrag:4c551f814a951c5e6f74e5c225c5e160
a=ice-pwd:7877be1235781d443361467a70b33c12
a=candidate:Hac1e0808 1 UDP 2130706431 172.30.8.8 13528 typ host
a=candidate:Hac1e0808 2 UDP 2130706430 172.30.8.8 13529 typ host
a=connection:new
a=setup:active
a=fingerprint:SHA-256 75:D2:BE:77:B6:8E:1B:4E:F9:BF:FB:34:54:2D:05:31:F6:97:C5:34:F3:D9:65:BE:FC:C6:E4:5C:1A:5E:11:E7
a=rtcp-mux
a=sendrecv
如果有帮助,以下是设置通话和播放时记录的完整事件集:
addStream
createOffer
negotiationneeded
createOfferOnSuccess
setLocalDescription
signalingstatechange
setLocalDescriptionOnSuccess
icegatheringstatechange
icegatheringstatechange
setRemoteDescription
signalingstatechange
iceconnectionstatechange
onAddStream
setRemoteDescriptionOnSuccess
进一步编辑:在查看了一些 SDP docs 并查看了我自己的 SDP 日志之后,我看到的主要不同之处可能是 Firefox 工作的原因,而 Chrome 不是 Firefox 有这条线
c=IN IP4 192.168.99.123
这确实是我的 IP 地址,而 Chrome 有这条线
c=IN IP4 0.0.0.0
我尝试从终端运行 Chrome 以捕获打印到屏幕上的任何调试输出,除了我在 chrome://webrtc-internals 中看到的内容之外,我发现此消息每秒显示多次:
ERROR:dtlstransport.cc(557)] Jingle:DtlsTransport[audio|1|__]: Received non-DTLS packet before DTLS complete.
我已经阅读了许多有关该错误的 Google 搜索结果,但无法提出任何解决方法。但是,它似乎可能相关;如果一个或多个 UDP 数据包发送到错误的位置,那么即使大多数音频数据包被正确发送,它们也永远不会被解码,我们会看到大量数据进入但实际上没有音频被播放。这确实是我所看到的。
我会做更多的挖掘,看看我可以调整哪些设置以使 Chrome 发送与 Firefox 发送的相同类型的信息,或者让 Asterisk 为它们两者做正确的事情。与此同时,我正在就这个问题开一个赏金,因为任何额外的帮助和建议都将不胜感激。
【问题讨论】:
-
提供 SDP(提议/回答)消息。您可以在 chrome://webrtc-internals 中挖掘更多内容
-
@Ajay:按照建议,我已编辑问题以包含 SDP 消息。工作的 Firefox 和不工作的 Chrome 日志之间存在显着差异,但不幸的是,我对 SDP 的了解不够,无法说出与实际问题相比哪些差异是显着的。
-
几年前的帖子,不确定是否有帮助3cx.com/community/threads/webrtc-no-audio.40818
标签: google-chrome webrtc asterisk sip