在JavaScript

时间:2017-07-31 10:07:31

标签: javascript audio synchronization streaming live-streaming

以下是我的问题的高级概述:

艺术画廊将有一台中央计算机,还有三个独立的远程站点,比如距离中心一英里。每个网站都有一位音乐家。中央计算机通过互联网向三个音乐家中的每个音乐家发送一个现场支持音轨,他们一起播放并且每个音乐家都被录制为直播。然后在画廊中回放三个流中的每一个,与背景音轨和其他音乐家同步,就像所有音乐家在同一房间中现场演奏一样。客户要求音乐家似乎彼此及时地进行游戏,即每个音乐家之间没有明显的等待时间。音乐家们听不到对方的声音,他们只听到了背景音乐。

以下是我所看到的技术解决方案:

每个支持跟踪数据包都使用当前时间戳从库中发送出去。当音乐家播放并被记录时,当前正在记录的分组被标记有当前后备跟踪分组的时间戳。当三个音频流被发回时,它们被缓冲。然后播放每个数据包,例如,在其时间戳之后十秒。即在上午11:00:00,播放标记为10:59:50 AM的所有数据包。

或者以另一种方式来思考,每个传入的流都比实时延迟10秒。此缓冲应允许任何网络闪烁。这也是可以接受的,因为画廊中的观众没有明显的延迟,并且所有内容都在播放" as-live。"我们假设每个远程站点都有一个高质量的互联网连接。

我理想地寻找一个JavaScript解决方案,因为它是我最熟悉的(但其他解决方案也很有趣)。

有没有人知道任何具有内置功能的JavaScript库允许这种缓冲?

1 个答案:

答案 0 :(得分:0)

要说清楚,听起来音乐家们彼此及时播放并不重要......只是他们在背景音轨中及时播放,彼此在约10秒内,是否正确?假设情况就是这样......

站点到站点连接

您可以使用WebRTC,但我们只会使用数据通道。不需要媒体流。这是一个需要精确计时的性能,而且我也假设音质质量不错。我们将它留在PCM中并通过WebRTC数据通道发送。

或者,您可以使用服务器主机Web Socket连接将数据中继到站点。

录音和播放

您可以使用ScriptProcessorNode进行播放和录制。这使您可以原始访问PCM流。只需通过数据通道发送/接收字节。如果要节省一些带宽,可以将浮点样本减少到16位整数。只需将它们转回到接收端浮动。

同步

主要同步需要在支持轨道和录制的回放同时进行的情况下发生。立即开始播放后,开始录制。如果您正在使用前面提到的ScriptProcessorNode,您实际上可以在同一节点中执行这两项操作,从而保证样本精确同步。

在播放时,只需缓冲所有曲目,直到获得所需的缓冲级别,然后在ScriptProcessorNode内同时播放它们。同样,这是样本准确的。

现在你唯一需要处理的是时钟漂移。对你来说44.1kHz的实际可能是44.099kHz。这可能会随着时间的推移而增加,但只要您在一段时间内重置所有这些内容,通常就不需要关注自己。也就是说,只要你没有停止录制一整天或更长时间,它就不会成为你的问题。

  

录制的数据包应标记为传入的后备跟踪数据包的时间戳

不,这种同步不应该发生在网络层。如果您使用带有WebRTC数据通道或Web Socket的可靠传输,则无需执行任何操作,只需在字节0处启动所有流。不要使用时间戳,使用样本偏移量。

  

有没有人知道任何具有内置功能的JavaScript库允许这种缓冲?

我实际上已经建立了一个项目来做类似的事情,允许从一个站点到另一个站点的样本准确的互联网广播切换。它会随着时间的推移建立一个缓冲区,然后为了实现切换,它基本上会重新同步到新站点的主时钟。由于新网站位于旧网站后面,并且由于我们无法轻易地缩短空间/时间,因此我稍微退出缓冲区并接收新网站的主时钟。 (如果单个站点存在缓冲区欠载,则没有任何不同!)无论如何,我不知道有任何其他代码可以执行此操作。