Har*_*San 11 php ajax websocket webrtc
大约六个月前,我能够用PHP成功编写自己的WebSocket服务器脚本.通过这些,我能够在我的本地主机上设置WebRTC视频聊天服务.我很高兴,直到我意识到为了部署它,我需要一个让我可以访问套接字的Web服务器.
不幸的是,没有共享的虚拟主机允许套接字和所有提供套接字的Web服务器都很昂贵.虽然不是大规模的有效解决方案,但为了设置演示以向人们展示,我想将信令方法从WebSocket更改为Ajax,以便我可以展示我制作的WebRTC视频聊天服务.
为此,我一直在努力编写过去几天的代码,但是没有成功让WebRTC对等方捕获彼此的视频.
目前,当一个客户端连接到脚本时,我正在使用Ajax向PHP脚本发送请求,该脚本检查数据库中是否还有其他活动用户.如果没有,则脚本会创建商品,并将商品放入数据库中.之后,客户端每秒轮询一个单独的PHP脚本,以检查连接到该脚本的另一个客户端的答案.
之后,我从另一个客户端连接到该脚本,该客户端查询相同的PHP脚本和DB,然后实现活动用户(第一个连接)已经发布了一个商品,第二个客户端获取并设置了该商品.描述.然后,第二个客户端创建一个答案,该答案放在DB中.
此时,第一个客户端(每秒轮询数据库)检测到答案存在并将该答案设置为第一个客户端的远程描述.不幸的是,即使在成功完成所有这些操作之后,其他客户端的视频也没有弹出.
所以这里是我困惑的地方,有三个(多部分)问题:
1)我认为在两个客户端设置了本地描述然后将该本地描述发送到另一个客户端和接收描述的另一个客户端集作为onaddstream事件应该触发的远程描述,从而允许我显示远程视频.但是,这种情况并没有发生.这在我使用WebSocket之前工作正常,但它与纯Ajax完全不兼容.有什么特别的东西我不见了吗?WebRTC规范在过去六个月中是否发生了根本变化?我曾尝试查看WebRTC规范,但我没有看到任何重大变化.
2)在没有使用Ajax工作的沮丧之后,我回到了我的WebSocket版本并将其加载到我的本地主机上.自从上次使用它以来(我六个月前工作正常),我根本没有更改过代码,但是现在,当我尝试使用它时,有时它会起作用,有时它不起作用.有时我会收到与无法设置本地和/或远程描述相关的错误.怎么了?那些会导致这种情况发生变化的规格有变化吗?与此相关,即使我无法使用Ajax版本弹出远程视频,我也一直在向控制台发出很多东西,而且看起来像是Ajax版本,有时是本地和成功设置了两个客户端的远程描述,有时在尝试设置本地/远程描述时出现错误,即使我每次运行完全相同的脚本而没有任何更改.我正在使用最新版本的Chrome,我开始怀疑它是否存在错误.
3)是否需要onicecandidate事件处理程序来建立连接?我的假设是,对等体可以通过简单的有效提供和回答建立连接,并且onicecandidate事件用于提供备用路由等,这可以导致更好的连接(但不是必需的).我错了吗?如果需要onicecandidate信息,你如何建议我用Ajax作为信令方法来处理它?
我知道这是很多信息和很多问题,但任何人都可以提供的任何信息/见解都将非常感激.在过去的几天里,我一直在敲我的桌子试图解决这个问题,没有任何意义.
eep*_*epp 13
我对你的应用的第一个建议.零星工作/不工作是看当前的在线工作实施.互联网上有大量的WebRTC演示.
关于AJAX:为什么它不起作用?我目前正在和你做同样的事情,每次都很好(我暂时无法透露消息来源).客户端不断定期轮询服务器,他们可以通过这种方式将SDP描述/ ICE候选者发送给特定的其他客户端.服务器充当简单的桥(这是信令的基础).
无论是WebSocket,AJAX还是IPoAC,只要您将所需的一切转移到其他客户端(并且在适当的时候,稍后会更多),它应该可以工作.我甚至做了一个演示,您可以使用文本区域手动复制/粘贴SDP描述和ICE候选,然后单击按钮在信号传输过程中向前移动,当然,也可以正常工作.
现在:是的,你需要ICE候选人.查看我刚刚在Chromium 27上生成的示例SDP商品块createOffer:
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
Run Code Online (Sandbox Code Playgroud)
你看到任何可以帮助其他客户连接到我的机器的东西吗?我不这么认为.所有这种ICE机制的目的是192.168.1.15使用STUN 收集连接候选者(本地的,如"公共"的(由您的ISP分配的公共IP))如果您在任何非对称的NAT后面,或者对称NAT的TURN则.
在接收到那些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
Run Code Online (Sandbox Code Playgroud)
现在,这些是具体的(尽管只是本地的,因为我没有使用任何STUN URL配置RTC对等连接)另一个对等方连接到我的机器.
本页底部有一些有趣的提示.我现在真的不能告诉你为什么你应该遵循这些或为什么它们首先存在,但我确实遵循它们并且没有信号问题.他们来了:
您可以通过使用一些WebRTC有限状态机来管理客户端上的所有内容.请参阅参考页面以了解远程流开始流动的含义.
尝试分享ICE候选人并在对方添加他们,至少按照提示#1和#3,你的应用程序应该再次工作.
您询问如何在ICE候选人重要分享(他们是)的情况下将ICE候选人从同伴转移到另一个候选人.要使用AJAX分享内容,无论这些内容是什么,您都可以使用邮箱.我相信你已经通过在数据库中放置客户应付的内容来做到这一点.
每当对等方需要向另一个用户发送内容时,请尽快发送(使用AJAX).在服务器端,将此"邮件"放在目标客户端的邮箱中.当对等方(定期)轮询服务器以获取新邮件时,请将其全部新邮件提供给它.
创建SDP报价时,会快速生成ICE候选项.所有那些ICE候选者和SDP描述可能会在几毫秒内进入目标邮箱.目标对等体很有可能立即轮询所有内容.即使ICE候选人迟到,它的下一轮投票也会得到它.