大约六个月前,我能够在 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,而且我开始怀疑是否有一个bug或其中的错误.

3)建立连接是否需要onicecandidate事件处理程序?我的假设是,同行可以建立一个简单的有效的提议和答案的连接,并且用户提供替代路由等,这可以导致更好的连接(但不是必需的).我错了吗?如果需要onicecandidate信息,那么您如何建议我使用Ajax作为信令方法呢?

我知道这是很多的信息和很多问题,但任何人都可以提供的任何信息/见解将非常感谢.过去几天我一直把我的头撞在我的桌子上,试图弄清楚,没有任何意义.

我对您的应用程序的第一个建议工作/不工作偶尔是看当前的在线工作实现.互联网上有大量的WebRTC演示.

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候选人迟到,其下一轮也会得到.

php – WebRTC视频聊天与Ajax而不是WebSocket:可能?的更多相关文章

  1. 五分钟学会HTML5的WebSocket协议

    这篇文章主要介绍了五分钟学会HTML5的WebSocket协议,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  4. ios – Websockets可以在移动电话上工作吗?

    相关地,我怀疑长轮询客户端可能是实现类似功能的好方法,但我想知道我可能遇到的移动特定问题.到目前为止,我已经读过长时间的轮询请求可能会对电池寿命产生相当大的影响.我还听说iOS以某种方式限制了对单个服务器的连接数量,这可能是个问题.有没有人在使用实时组件的移动应用程序上工作?

  5. ios-swift,objective-c协议实现

    作为隐式解开的可选项.

  6. 在iOS上构建WebRtc

    msg/discuss-webrtc/VJg-fk2-i_0/dtG200DOzsgJ但步骤不明确.某人可以总结这些步骤,以便将来对所有人都有用吗?解决方法我写了一篇详细的博客文章,其中包含有关如何构建WebRTC示例iOS应用程序的所有说明,以及如何在iOS模拟器或实际的iOS设备上运行它.你可以takealookhere阅读细节,这是一个非常漫长的过程.

  7. ios – 红蜘蛛代表没有被召集

    变量不是nil,我有一个很好的连接,url是正确的,但没有调用委托方法.我也正在实现WebSocketDelegate解决方法套接字应该是您的类的属性或变量,以确保它附近.如果仅在函数堆栈上分配它,它将超出范围,并且永远不会调用委托以下是我在项目中使用的代码,以防万一这是link到故事板,以防万一你想要

  8. ios – 可以在iPhone上使用Web RTC,如果是这样,怎么样?

    可以在iPhone上使用WebRTC,如果是这样,怎么样?我们如何在iPhone中集成WebRTC.解决方法有一些适用于iOS的基于WebRTC的SDK.看看这篇文章:http://bloggeek.me/webrtc-fit-ios/

  9. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  10. swift 实现websocket与后台通信(swift 如何构建简单的json字符串)

    一个应用不可避免要与服务器进行通信,主要有,http与socket。http暂时不论,我们先看看socket下面衍生的websocket,今天我就把自己怎么利用websocket与服务器进行交互记录下来:首先你需要集成websocket到自己的项目,如果不明白如何集成,请看上一篇《swift集成websocket库》集成websocket到自己项目后还需要添加SwiftyJSON到自己项目,具体步骤和集成websocket一样。首先打开你项目,记得通过cocoapods生成的.xcworkspace文件打

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部