基本上,对于我团队的应用,我们需要能够跨多个iOS设备同步音乐。我们这样做的第一种方式是在所有设备上播放音乐,然后向所有设备发送播放命令。有些人会比其他人晚得多,所以这种方法不起作用。提到了一个想法来计算所有设备之间的延迟,并根据延迟在适当的时间发送命令。
提出的第二种方法是流式传输音乐。如果我们要实现流式传输,我们应该怎么做呢。应该使用音频单元,OpenAL等吗?此外,如果正在进行流式传输,我们将如何确保每个设备的流同步。
基本上,音频必须同步,以便听到它的人无法区分设备。几毫秒的休息应该不是问题(除非听众有超人听力)。
答案 0 :(得分:3)
你会惊讶于人类在发现音频异常方面有多么好听......
同步时间
如果方式变化很大(wifi等),有效地尝试满足整个负载的实时要求。我强烈怀疑你接近这样做的唯一方法是发出一个包含特定时间开始播放的“播放”指令。当然,这取决于所有时钟的准确设置。
<强> NTP 强>
我不知道iPhone如何获得他们的时间。如果他们使用(或可能使用)NTP,那么你将会越来越近。 NTP旨在通过网络传输准确的时间信息,尽管存在可变的网络延迟。我快速浏览了一下,似乎iOS的大多数NTP客户端都是简单的,而不是测量和调整网络延迟,时钟漂移等的完整NTP。
<强> GPS 强>
另外,GPS也是非常好的时间信息来源。再一次,我不知道iPhone是否可以或确实使用GPS来设置他们的时钟,但如果可以做到那么这可能会非常好。在Solaris上(我认为Linux也是如此)大多数GPS芯片从GPS信号产生的每秒1脉冲可用于调节内部OS时钟,使其确实非常准确(亚微秒精度)。
我担心iPhone本身不会做这些事情;两者都涉及使用相当多的电力,所以如果他们做了其他不太复杂的事情,我也不会感到惊讶。
手机时间服务
某些Cell网络也提供时间服务,但我认为它不是为精确的时间设置而设计的。此外,它往往无处可用。您经常在主要机场找到它,以便最近到达的人将他们的手机设置为接近当地时间。
在时间X播放
因此,如果其中一个可用于确保所有iPhone设置为完全相同的时间,那么您所要做的就是编写软件以在特定时间开始播放。这可能涉及在一个非常紧凑的循环中轮询时钟,等待它翻过来;大多数操作系统在 特定时间之前不提供睡眠方式。他们至少允许在一段时间内睡觉 ,这可以用来睡到接近指定的时间。然后,您将开始轮询时钟,直到达到正确的时间。
延迟测量和标准偏差
我认为你的第一种方法注定要失败。您可能能够测量平均延迟等等,但这并不意味着每条消息都具有完全相同的延迟。延迟的标准偏差将告诉您可以实现的目标,而且我认为这不会特别小。如果是,则消息必须包含时间戳。
NTP可以工作,因为它只对一段时间内测量的平均延迟感兴趣(有时是几小时),而你对瞬时延迟感兴趣。
使用RTP进行流式传输
如果您可以按上述方式同步设备,则第二种方法可能有效。 RTP协议旨在用于这些情况;它对实现同步没有帮助,但它确实对流媒体有很大帮助。它会告诉您流中的任何一个接收数据适合的位置,允许您在合适的时间播放它。
时钟漂移
要解决的另一个问题是你要玩多久。如果时间很长,那么您可能会发现每个设备上的44kHz(或其他)音频时钟频率并不完全相同。因此,虽然您可能会找到一种同时开始播放所有内容的方法,但是单独的设备将会稍微开始发散。在很长一段时间内,他们可能会明显失控。
<强>蓝牙强>
可能可以使用蓝牙做一些事情。它有许多奇怪而精彩的配置文件,可能其中一个用于发送准确的“立即开始”消息。
音频触发
您也可以使用声音作为传达开始信号的方法。一个设备可以播放特定的声音,而其他设备的软件正在用麦克风收听。当在声音中检测到特定功能时,这是每个人开始播放的时间。计算机化的“1,2,2 a 1 2 3 4”。
相机闪光灯
应该很容易在软件中找到...
答案 1 :(得分:0)
我认为如果你稍微扩展一下,你的第一种方法就会奏效。假设设备上的所有时钟都是同步的,您可以在播放命令中包含时间戳。然后,每个设备将计算时间戳和收到命令之间的时间。然后你会播放音乐并用时差来抵消它。