【问题标题】:Synchronize video on multiple clients as accurately as possible?尽可能准确地在多个客户端上同步视频?
【发布时间】:2015-11-09 02:21:36
【问题描述】:

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

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

但这并没有真正奏效。它在很大程度上取决于您的延迟,我无法让它在延迟小于 300 毫秒的情况下可靠地工作(为此需要非常好的延迟)。

那么我可以做些什么来改进它呢?我应该更改我的设置(javscriptajaxphpmySQL)吗?

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

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;
});

知道如何改进整个概念吗?
顺便说一句,视频不能在我自己的服务器上。

【问题讨论】:

  • 每个客户报告他们播放视频的时间如何?然后服务器可以根据每个客户端播放的差异计算“暂停时间”。
  • 研究NTP中的时钟同步算法:en.wikipedia.org/wiki/…
  • @Grasshopper 你不明白。假设服务器计算出您必须暂停 2 秒。现在如果(由于延迟)包含暂停时间的响应需要 0.5 秒才能到达您的计算机,会发生什么?您将有效地暂停 0.5 秒,因为服务器不可能提前减去数据包的传输时间。

标签: javascript php ajax websocket video-streaming


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    最准确的方法可能是使用套接字:这样您就可以向其他系统发出所需的信号,而无需等待 ajax 轮询。您将无法准确补偿延迟,但可以通过使用一些测试消息测量往返行程来平均结果。

    所以计划是:

    1. 所有客户端都预加载准备好播放的视频
    2. 所有客户端都向服务器打开套接字并表明它们已准备好运行
    3. 服务器运行一些快速测试消息来测量延迟。
    4. 服务器向所有客户端发送“go”消息,可能会延迟以考虑延迟(或指示客户端暂停的时间;任何一种方式都有效)
    5. 如果客户端停止,它会向服务器发送消息;服务器立即向其他客户端发送消息以停止。
    6. 客户回复他们暂停的位置
    7. 重新启动时,调整启动消息以考虑延迟和一些客户端稍后暂停的事实。

    我使用了非常相似的东西来同步 3 辆汽车的 18 台投影仪,用于 AV 显示系统。 (https://vimeo.com/97191170)。尽管 Xorifelse 在他的回答中使用了 cmets,但 PHP 完全能够每秒从控制器(浏览器中基于 jquery 的应用程序,通过套接字连接)接收、处理和处理多达 100 个套接字命令,过滤掉重复项,将它们全部记录到 mySQL 中第二个按需轮询进程(大约每秒 10 次,由来自 Flash (Adobe Air) 脚本的套接字请求触发,然后还将灯光指令传递给车底照明(也通过套接字)或其他汽车(也通过sockets)。事实上,PHP/MySQL 解决方案比尝试将 socket 指令直接泵入 Flash 要强大得多。这很有可能。该项目的技术细节在这里:http://labs.soapcreative.com/cars-that-feel-vivid-sydney/

    【讨论】:

    • 那么我应该使用 PHP 还是 node.js 是更好的选择?
    • 你知道哪些? Node.js 有它的优点;最值得注意的是,它可以保持空闲并等待触发; PHP 你需要作为一个单独的程序运行,循环等待指令。不要误以为 NodeJS 具有 PHP 不能多线程的优势——它可以;但在这里可能无关紧要,因为单线程 PHP 应该绰绰有余(如上所述)。但是,如果您知道 NodeJS,那么我会使用它。使用 socket.io。我只提到了你在问题中标记的 PHP,它会做你需要的。
    【解决方案3】:

    我建议以NodeJS和sockets编程来实现。此外,您可以使用http://www.webrtc.org

    【讨论】:

    • 了解您提出这些建议的原因以及使它们适合此问题的原因会很有帮助。
    【解决方案4】:

    正如其他人所说,我可能会在 NodeJS 中设置一个小型 websocket 服务器。 这个想法是创建一个事件列表,例如“播放”、“暂停”。当客户端连接时,它会询问服务器它应该从哪里开始播放(因为其他客户端可能在它之前开始),或者如果您愿意,您可以在每次有人连接时向所有客户端广播“StartAgain”事件。 一旦视频开始播放,您就可以监听 HTML 音频/视频事件,以检测客户端视频是否停止播放。在这种情况下,您向服务器发送一个“暂停”事件,服务器会将其广播给所有其他客户端以暂停播放。当视频恢复时,您可以发送“播放”事件。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 2012-11-27
      • 2021-09-01
      • 1970-01-01
      • 2018-08-23
      • 2015-02-12
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多