如何在2个或更多iOS设备上同步音频播放?

时间:2013-04-29 18:04:20

标签: ios objective-c ruby-on-rails ruby

我想写一个网络应用程序,它允许我将MP3的音频播放同步到~50ms,或者足够接近人耳无法检测到差异。

这个想法是两个或更多智能手机可以与蓝牙扬声器配对,两个或更多扬声器可以在同一时间播放相同的音频。

您如何建议我在客户端和服务器端进行设置?我打算在后端使用Rails / Ruby,在移动设备上使用iOS / obj。

我曾想过同步到服务器上的全局/原子钟,并让服务器向客户提供何时开始播放/跳入已播放曲目的指令。我担心的是,如果我想要传输音频,就不可能将歌曲加载到内存中并在毫秒级别上准确开始播放。

思想?

2 个答案:

答案 0 :(得分:1)

互联网数据包传输中的抖动太大,因此忘记通过互联网进行同步。但是,当你在“设置”中打开自动日期/时间时,你可以检查操作系统中仍然使用的NTP的准确性(我猜,我知道旧的UNIX使用它),但我的猜测是它赢了“也足够好。但也许操作系统也可能使用其他时间源,如GPS;我不知道iOS是如何做到的,但是在20ms内的准确度是不可预期的。您可以创建实验性应用程序来检查它。

所以,剩下的是离家更近的同步,意味着直接在设备之间。当然,您需要确保所有设备都已加载(足够)歌曲,并已预先加载AVAudioPlayer或您正在使用的任何设备,以便能够立即开始播放。 (实际上,使用更高级别的'AVAudioPlayer` API可能不是最佳选择,因为它可能会提供更高的延迟,以及比较低级别的API更重要的更高抖动。)

这里有三个想法(一个设备需要主控触发开始播放,其他设备是等待触发的从设备):

  • 使用音频触发脉冲,如定义长度和频率的高音。然后使用FFT识别此音调。
  • 通过GameKit蓝牙连接设备并在这些连接上传输触发器。
  • 使用iPhone 4+闪光灯作为触发器:以某种模式闪光。这将要求您对视频数据进行采样,这是非常可行且可以非常快。

答案 1 :(得分:0)

我将使用一个使用原子钟进行同步的解决方案,以及一个允许服务器指令/消息以近距离同步方式发送到所有设备的外部服务。