使用 WiFi 在 iOS 设备之间同步音频的最佳方法是啥?

Posted

技术标签:

【中文标题】使用 WiFi 在 iOS 设备之间同步音频的最佳方法是啥?【英文标题】:What is the best method of synchronizing audio across iOS devices with WiFi?使用 WiFi 在 iOS 设备之间同步音频的最佳方法是什么? 【发布时间】:2013-06-29 06:25:22 【问题描述】:

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

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

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

【问题讨论】:

我不能自称是专家,但我的感觉是,这比第一次出现的问题要困难得多。人类的听觉对音频延迟非常敏感(大脑使用它来计算源的位置)。同步一组扬声器的最佳方式仍然是电缆。 几毫秒距离。几乎任何人都可以检测到这一点。如果你不相信我,打开两个收音机,把它们放在一个大房间的不同边,然后注意它听起来有多奇怪。此外,您永远不会让 iOS 设备的时间如此准确。由于您对问题设置的时间限制,您正在做的事情是不可能的。 @ChrisGalzerano 所以在听音乐时选择哪种方式可以在设备中实现 100% 的准确度 【参考方案1】:

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

同步时间

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

NTP

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

全球定位系统

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

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

小区时间服务

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

在 X 时间播放

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

延迟测量和标准偏差

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

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

使用 RTP 流式传输

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

时钟漂移

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

蓝牙

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

音频触发器

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

相机闪光灯

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

【讨论】:

【参考方案2】:

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

【讨论】:

这远不能达到所需的毫秒精度,即使是这样,时钟漂移(来自音频设备)也会很快导致不同步。

以上是关于使用 WiFi 在 iOS 设备之间同步音频的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 音频基础知识(一)

在通过 WiFi 连接的两个或多个设备之间通话 - iOS

在 iOS 10 中进行有效同步的异步调用的最佳方法

如何在文件副本之间同步音频元数据(例如 ID3)?

iOS 设备的最佳声音格式? (iPhone & iPad)

在设备之间共享 iOS sqlite 数据库的最佳方式是啥