尽可能准确地在多个客户端上同步视频?

时间:2015-08-16 09:26:58

标签: javascript php ajax websocket video-streaming

我想在多个客户端上同步播放视频。 一个客户端将为服务器提供一个视频的URL,该视频可以流式传输并点击播放,然后每个客户端都应该在同一时间开始播放视频。在播放时必须确保每个客户端仍然保持同步。如果有人突然停止播放,其他人必须尽快停止。 (此时停止的客户端将落后1秒左右。)然后当同一个人再次开始播放时,其他人显然必须等待一秒钟,直到一个客户端赶上并开始播放。

我的第一个尝试是设置mySQL数据库,让每个客户端不断向其报告当前的视频时间。然后,服务器计算数据库中的任何客户端是否落后,如果是,则为每个客户端计算他们必须暂停多长时间才能让它赶上来。

但这并没有真正奏效。它强烈依赖于你的延迟,我无法在延迟<300ms的情况下可靠地工作(需要非常好的延迟)。

那么我该怎么做才能改善呢?我应该更改我的设置(javscript&lt; - &gt; ajax&lt; - &gt; php&lt; - &gt; mySQL)?

如何可靠地计算服务器发送客户端的响应时间?我的意思是,我不能只假设客户端的系统时间与服务器的系统时间相同...... 我能想到的最好的事情就是这样:

var start = new Date().getTime()
$.post( "sync.php", "")
.done(function(data) {
    var end = new Date().getTime()/1000;
    var clientServerClientTravelTime = (end-start);
    var estimatedServerClientTravelTime = clientServerClientTravelTime/2;
});

知道如何改进这整个概念吗? Btw视频不能在我自己的服务器上。

2 个答案:

答案 0 :(得分:4)

最准确的方法可能是使用套接字:通过这种方式,您可以向其他系统发出信号,并且不需要等待ajax轮询。您将无法准确地补偿延迟,但可以通过使用一些测试消息测量往返来平衡事情。

所以计划是:

  1. 所有客户端预加载视频已准备就绪
  2. 所有客户端打开服务器的套接字并指示它们已准备好隆隆声
  3. 服务器运行一些快速测试消息来测量延迟。
  4. 服务器向所有客户端发送“go”消息,可能延迟考虑延迟(或指示客户端暂停的时间;无论哪种方式都有效)
  5. 如果客户端停止,它会向服务器发送消息;服务器立即向另一个客户端发送消息以停止。
  6. 客户回复暂停的位置
  7. 重新启动时,请调整启动消息以考虑延迟和某些客户端稍后暂停的事实。
  8. 我使用的东西非常类似于将3台汽车同步18台投影机用于AV显示系统。 (https://vimeo.com/97191170)。尽管Xorifelse在他的回答中发表了评论,但PHP完全能够接受,处理和处理来自控制器(浏览器中基于jquery的应用程序,通过套接字连接)每秒多达100个套接字命令,过滤掉重复项,将它们全部记录到mySQL中按需轮询的第二个过程(大约每秒10次,由Flash(Adobe Air)脚本的套接字请求触发,然后还将灯光指示传递给车下照明(也通过插座)或其他车辆(也通过事实上,PHP / MySQL解决方案比试图直接将套接字指令直接引入Flash更加强大。这很可能。项目的技术细节在这里:http://labs.soapcreative.com/cars-that-feel-vivid-sydney/

答案 1 :(得分:0)

您是否尝试过使用WebRTC,它用于点对点连接,也用于流式传输。使用WebRTC,您可以将多个流从一个客户端传输到其他客户端,我已经使用它将视频流式传输给其他人,并且每个连接的人都在获取视频,但我不是在流式传输服务器,我只是控制视频,暂停,声音,......

您可以尝试使用它,但在您的情况下,每个客户端都可以控制流。就个人而言,我没有尝试过类似的东西,但这样你就没有延迟,暂停等问题。

相关问题