1

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

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

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

4

2 回答 2

3

您会惊讶于我们的人耳在发现音频异常方面的能力...

同步一天中的时间

如果路上的事情非常多变(wifi等),您实际上是在尝试通过整个负载来满足实时要求。我强烈怀疑您要接近这样做的唯一方法是发出“播放”指令,其中包括开始播放的特定时间。当然,这依赖于准确设置所有时钟。

NTP

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

全球定位系统

另外,GPS 也是一个很好的时间信息来源。同样,我不知道 iPhone 是否可以或确实使用 GPS 来设置时钟,但如果可以做到,那可能会非常好。在 Solaris(我也认为是 Linux)上,大多数 GPS 芯片从 GPS 信号生成的每秒 1 个脉冲可用于调节内部操作系统时钟,使其确实非常准确(亚微秒精度)。

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

小区时间服务

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

在时间 X 播放

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

延迟测量和标准偏差

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

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

使用 RTP 流式传输

如果您可以如上所述对设备进行时间同步,则您的第二种方法可能会起作用。RTP 协议就是为这些情况而设计的;它对实现同步无济于事,但对流式传输确实有很大帮助。它会告诉您流中任何一条接收到的数据适合的位置,让您可以在正确的时间播放它。

时钟漂移

另一个需要处理的问题是你玩了多久。如果时间较长,您可能会发现每台设备上的 44kHz(或其他)音频时钟速率并不完全相同。因此,虽然您可能会找到一种同时开始播放所有设备的方法,但随后单独的设备将开始出现如此细微的差异。在很长一段时间内,它们可能会明显消失。

蓝牙

可以用蓝牙做一些事情。它有许多奇怪而精彩的配置文件,其中一个可能会用于发送准确的“现在开始”信息。

音频触发器

您也可以使用声音作为传达开始信号的一种方式。一台设备可以播放特定的声音,而其他设备中的软件正在使用麦克风收听。当在声音中检测到特定特征时,就是每个人都开始演奏的时候了。一种计算机化的“1, 2, a 1 2 3 4”。

相机闪光灯

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

于 2013-06-29T06:47:39.503 回答
0

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

于 2013-06-29T06:30:22.847 回答