使用WiFi在iOS设备上同步音频的最佳方法是什么?

基本上,对于我团队的应用程序,我们需要能够跨多个iOS设备同步音乐。 我们这样做的第一种方式是在所有设备上播放音乐,然后向所有设备发送播放命令。 有些人会比其他人晚得多,所以这种方法不起作用。 提到了一个想法来计算所有设备之间的延迟,并根据延迟在适当的时间发送命令。

提出的第二种方法是流式传输音乐。 如果我们要实现流媒体,我们应该怎么做呢。 音频单元应该使用,OpenAL等吗? 此外,如果正在进行流式传输,我们将如何确保每个设备的流同步。

基本上,音频必须同步,以便听到它的人无法区分设备。 几毫秒的rest应该不是问题(除非听众有超人听力)。

你会惊讶于人类在发现音频exception方面的表现有多好……

同步时间

如果路上变化很大(wifi等),你有效地尝试满足整个负载的实时需求。 我强烈怀疑你接近这样做的唯一方法是发出一个包含特定时间开始播放的“播放”指令。 当然,这取决于所有时钟的精确设置。

NTP

我不知道iPhone如何获得他们的时间。 如果他们使用(或可能使用)NTP,那么你将会越来越近。 NTP旨在通过网络传输准确的时间信息,尽管存在可变的网络延迟。 我快速浏览了一下,似乎iOS的大多数NTP客户端都是简单的,而不是测量和调整网络延迟,时钟漂移等的完整NTP。

全球定位系统

或者,GPS也是非常好的时间信息来源。 我再也不知道iPhone是否可以或确实使用GPS来设置他们的时钟,但如果可以做到那么那可能会非常好。 在Solaris上(我认为Linux也是如此)大多数GPS芯片从GPS信号产生的每秒1脉冲可用于调节内部OS时钟,使其确实非常准确(亚微秒精度)。

我担心iPhone本身不会做这些事情; 两者都涉及使用相当多的电力,所以如果他们做了其他不太复杂的事情,我也不会感到惊讶。

细胞时间服务

一些Cell网络也提供时间服务,但我认为它不是为精确的时间设置而设计的。 此外,它往往无处可用。 您经常在主要机场找到它,以便最近到达的人将他们的手机设置为接近当地时间。

在X时刻玩

因此,如果其中一个可用于确保所有iPhone设置为完全相同的时间,那么您所要做的就是编写软件以在特定时间开始播放。 这可能涉及在一个非常紧凑的循环中轮询时钟,等待它翻过来; 大多数操作系统特定时间之前不提供睡眠方式。 他们至少允许睡一段时间,这可以用来睡到接近约定的时间。 然后,您将开始轮询时钟,直到达到正确的时间。

延迟测量和标准偏差

我认为你的第一种方法注定要失败。 您可能能够测量平均延迟等等,但这并不意味着每条消息都具有完全相同的延迟。 延迟的标准偏差将告诉您可以实现的目标,而且我认为这不会特别小。 如果是,则消息必须包含时间戳。

NTP可以工作,因为它只对一段时间内测量的平均延迟感兴趣(有时是几小时),而你对瞬时延迟感兴趣。

使用RTP进行流式传输

如果您可以按上述方式同步设备,则第二种方法可能有效。 RTP协议旨在用于这些情况; 它对实现同步没有帮助,但它确实对流媒体有很大帮助。 它会告诉您流中的任何一个接收数据适合的位置,允许您在正确的时间播放它。

时钟漂移

另一个需要处理的问题是你要玩多久。 如果时间很长,那么您可能会发现每个设备上的44kHz(或其他)音频时钟频率并不完全相同。 因此,虽然您可能会找到一种同时开始播放所有内容的方法,但是单独的设备将开始分散。 很长一段时间,他们可能会明显失控。

蓝牙

也许可以用蓝牙做点什么。 它有许多奇怪而精彩的配置文件,可能其中一个用于发送准确的“立即启动”消息。

音频触发器

您也可以使用声音作为传达开始信号的方法。 一个设备可以播放特定的声音,而其他设备的软件正在使用麦克风收听。 当在声音中检测到特定function时,这是每个人开始播放的时间。 计算机化的“1,2,2 a 1 2 3 4”的排序。

相机闪光灯

应该很容易在软件中发现……

我认为如果你稍微扩展一下,你的第一种方法就会奏效。 假设设备上的所有时钟都是同步的,您可以在播放命令中包含时间戳。 然后,每个设备将计算时间戳和收到命令之间的时间。 然后,您将播放音乐并通过时差来抵消它。