不幸的是,没有共享的虚拟主机允许套接字和所有提供套接字的Web服务器是昂贵的.虽然不是大规模的有效解决方案,为了设置演示给人,我想将信号方法从WebSocket更改为Ajax,以便我可以炫耀我所做的WebRTC视频聊天服务.
为此,我在过去几天一直在尝试编写代码,但是让WebRTC对等人捕获对方的视频没有成功.
目前,当一个客户端连接到脚本时,我正在使用Ajax向PHP脚本发送请求,该脚本会检查数据库中是否还有其他活动用户.如果没有,脚本然后创建一个报价,并将报价放在数据库中.之后,客户端每秒轮询一个单独的PHP脚本,以检查连接到脚本的另一个客户端的答案.
之后,然后,我从另一个客户端连接到脚本,该客户端查询同一个PHP脚本和DB,然后实现了一个活动用户(第一个连接)已经发布了一个报价,第二个客户端获取并设置了远程描述.然后第二个客户端创建一个答案,它被放置在数据库中.
此时,第一个客户端(每秒轮询DB)会检测到答案存在,并将该答案设置为第一个客户端的远程描述.不幸的是,即使成功地完成了所有这一切,其他客户的视频也没有弹出.
所以这里是我困惑的地方,有三(多部分)问题:
1)我认为在两个客户端设置其本地描述之后,然后将该本地描述发送到另一个客户端,另一个接收到描述的客户端设置为onaddstream事件应该触发的远程描述,从而允许我显示远程视频.但是,这并没有发生.当我使用WebSocket时,这一切都很好,但是它并没有使用纯Ajax.有没有什么特别的我失踪? WebRTC规范在过去六个月内是否发生了彻底改变?我试过看过WebRTC规范,但是我看不到任何重大变化.
2)在没有使Ajax工作变得沮丧之后,我回到了我的WebSocket版本并将其加载到我的本地主机上.自从上次使用它以来,我没有改变代码(六个月前工作正常),但是现在,当我尝试使用它时,有时它可以工作,有时它不工作.有时我会收到与无法设置本地和/或远程描述相关的错误.这是怎么回事?是否有修改规范会导致这种情况发生?与此相关,即使我无法使远程视频弹出Ajax版本,我一直在向控制台发出很多东西,而且似乎与Ajax版本一样,有时也是本地和两个客户端的远程描述都已成功设置,有时会出现任何原因设置本地/远程描述时发生错误,即使每次运行完全相同的脚本而没有任何更改.我正在使用最新版本的Chrome,而且我开始怀疑是否有一个bug或其中的错误.
3)建立连接是否需要onicecandidate事件处理程序?我的假设是,同行可以建立一个简单的有效的提议和答案的连接,并且用户提供替代路由等,这可以导致更好的连接(但不是必需的).我错了吗?如果需要onicecandidate信息,那么您如何建议我使用Ajax作为信令方法呢?
我知道这是很多的信息和很多问题,但任何人都可以提供的任何信息/见解将非常感谢.过去几天我一直把我的头撞在我的桌子上,试图弄清楚,没有任何意义.
AJAX
关于AJAX:为什么不工作?我目前正在和你一样工作,每次都工作正常(我暂时不能透露来源).客户端定期轮询服务器,并且可以将SDP描述/ ICE候选者发送到特定的其他客户端.服务器作为一个简单的桥(这是信令的基础).
无论是WebSocket,AJAX还是IPoAC,只要你转移到其他客户端他需要的一切(在适当的时候,更多的是在此后),它应该工作.我甚至做了一个演示,您可以使用文本区域手动复制/粘贴SDP描述和ICE候选,并点击按钮在信令过程中向前移动,当然也可以正常工作.
ICE候选人
现在:是的,你需要ICE候选人.看看我刚刚在Chromium 27上使用createOffer生成的SDP提供块样例:
v=0 o=- 3866099361 2 IN IP4 127.0.0.1 s=- t=0 0 a=group:BUNDLE audio video a=msid-semantic: WMS 9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8 m=audio 1 RTP/SAVPF 111 103 104 0 8 107 106 105 13 126 c=IN IP4 0.0.0.0 a=rtcp:1 IN IP4 0.0.0.0 a=ice-ufrag:l8Qu31Vu4VG5YApS a=ice-pwd:TpyQ5iESUH4HvYGE4ay8JUhe a=ice-options:google-ice a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level a=sendrecv a=mid:audio a=rtcp-mux a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:bC5YSe2xCmui0wSxUHWKIi9INbZ2y0VrO1swoZbl a=rtpmap:111 opus/48000/2 a=fmtp:111 minptime=10 a=rtpmap:103 ISAC/16000 a=rtpmap:104 ISAC/32000 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:107 CN/48000 a=rtpmap:106 CN/32000 a=rtpmap:105 CN/16000 a=rtpmap:13 CN/8000 a=rtpmap:126 telephone-event/8000 a=maxptime:60 a=ssrc:1976175890 cname:/+lKYsttecoiyiu5 a=ssrc:1976175890 msid:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8 9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8a0 a=ssrc:1976175890 mslabel:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8 a=ssrc:1976175890 label:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8a0 m=video 1 RTP/SAVPF 100 116 117 c=IN IP4 0.0.0.0 a=rtcp:1 IN IP4 0.0.0.0 a=ice-ufrag:l8Qu31Vu4VG5YApS a=ice-pwd:TpyQ5iESUH4HvYGE4ay8JUhe a=ice-options:google-ice a=extmap:2 urn:ietf:params:rtp-hdrext:toffset a=sendrecv a=mid:video a=rtcp-mux a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:bC5YSe2xCmui0wSxUHWKIi9INbZ2y0VrO1swoZbl a=rtpmap:100 VP8/90000 a=rtcp-fb:100 ccm fir a=rtcp-fb:100 nack a=rtpmap:116 red/90000 a=rtpmap:117 ulpfec/90000 a=ssrc:3452335690 cname:/+lKYsttecoiyiu5 a=ssrc:3452335690 msid:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8 9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8v0 a=ssrc:3452335690 mslabel:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8 a=ssrc:3452335690 label:9kTlKaNe1exIs6JgEFYfXlu6E5f4B5R3I2D8v0
你看到有什么可以帮助另一个客户端连接到我的机器吗?我不这么认为所有这种ICE机制的目的是收集连接候选人(如192.168.1.15,本地的公共IP(由ISP分配的公共IP))使用STUN连接候选(如果你在任何不对称的NAT之后),或者TURN为对称NAT).
在接收到这些ICE候选人后,另一个对等方将使用一些预定义的度量来排序它们,以确定优先级,然后发出连接测试以找到一个好的候选者所以请分享他们:另一个同行需要他们(你也需要它).
所以这里有一些我的ICE候选人:
a=candidate:303249700 1 udp 2113937151 192.168.50.238 43806 typ host generation 0 a=candidate:303249700 2 udp 2113937151 192.168.50.238 43806 typ host generation 0 a=candidate:1552991700 1 tcp 1509957375 192.168.50.238 35630 typ host generation 0
现在这些是具体的(尽管只是本地的,因为我没有配置任何STUN URL的RTC对等体连接)方式让另一个对等体连接到我的机器.
WebRTC信令提示
在this page底部有一些有趣的提示.我真的不能告诉你现在为什么你应该遵循这些或为什么它们存在于第一位,但我没有跟随他们,没有信号问题.他们来了:
>对于回答者:不要添加ICE候选,直到对等方生成/创建答案SDP
>当远程流开始流动时,停止添加ICE候选
>在您提供SDP之前,不要为回覆者创建对等连接
您可以通过使用一些WebRTC有限状态机来管理客户端的所有这些.请参阅参考页面了解他的意思是远程流开始流动.
尝试分享ICE候选人并将其添加到对面,至少遵循提示#1和#3,您的应用程序应该再次工作.
信令通信
你问ICE如何将ICE候选人从同行转移到另一个候选人,以便ICE候选人重要分享(他们是).要使用AJAX共享东西,无论这些东西如何,都可以使用邮箱.我相信您已经通过将数据库中的客户端应用到的位置来执行此操作.
每当一个对等体需要发送一个对象时,尽快发送(使用AJAX).在服务器端,将此“邮件”放在目标客户端的邮箱中.当一个对等体(定期)轮询服务器的新邮件时,给它所有的新邮件.
当创建SDP报价时,快速生成ICE候选.所有这些ICE候选人和SDP描述可能会在几毫秒内进入目的地邮箱.目的地同行可以一次对所有需要进行投票的好机会.即使ICE候选人迟到,其下一轮也会得到.