我在 3 台不同的机器上运行 3 个具有相同时长的不同视频,并使用 websocket 服务器同步它们。我可以在机器之间获得非常准确的时间同步,但是更改任何视频的 currentTime
属性会导致显着且不可预测的延迟。
过去使用 WebAudio,我可以使用 start()
安排音频源的播放,但是 video.play()
没有这个功能。这使得几乎不可能说“在这个时间点播放视频的这一部分”。
这不是 HTML5 视频的选项吗?是否有我应该尝试的开箱即用的解决方案(例如媒体流、 Canvas )。我正在使用 Chrome,但我可以轻松地使用其他浏览器。
最佳答案
不幸的是,目前还没有视频以这种方式同步源的方法。
设置currentTime
的问题在于它是一个异步操作。设置时间后,无法保证视频会从该时间立即播放。浏览器将检查缓存,可能会在视频实际播放之前从网络加载并解码(当它播放时,它会通过 seeked
事件报告)。
只要我们错过了一种形式的 cue 方法,例如 Web Audio API(它也需要数据驻留在内存中),我们的选择就很有限。
我们现在可能会得到一个 hackish 解决方案,比如使用两个视频元素为时间/位置“双缓冲”,当预定时间到期时,开始并交换第二个元素(可能会也可能不会工作取决于系统、浏览器、网络、缓存、服务器响应时间等)。
根据视频的大小和长度,您可以预加载图像帧而不是视频。这将允许即时同步,但以初始加载时间和内存为代价。
不过,我认为更稳定的解决方案是使用专用解决方案在服务器端 同步流,并将浏览器用作被动客户端。 VideoLAN或 OBS可能会成功,或者一些与广播相关的商业专用软件/硬件能够处理同步引用信号。
只是我的 2 美分。
关于javascript - 跨机器安排和/或同步 HTML5 视频播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37577669/