21

虽然我意识到 AirPlay 具有固有的延迟/延迟,但我想知道(目前假设的)iPhone 应用程序是否有办法检测延迟是什么。如果是这样,该延迟值有多精确?我更好奇的是一个应用程序是否可以“知道”它自己的 AirPlay 延迟,而不是简单地最小化它。

4

3 回答 3

38

延迟不是来自网络抖动,而是由源设备(您的 iPhone)决定。

长话短说:

  • 苹果设备总是精确到 2 秒(精确到毫秒)。
  • 无法使用公共 API 对其进行调整。

音频延迟需要非常准确,以便多个输出可以同步播放。

关于 AirPlay 实现的一些解释:

  • 该协议以几个 RTSP 命令开始。在此握手期间,源传输 rtpTime,播放开始的时间,这也是您的延迟。典型值为 88200 = 2s x 44100 Hz。
  • AirPlay 设备可以通过 NTP 将其时钟与源时钟同步,以减少网络延迟。
  • 在播放期间,源会定期发送SYNC数据包以调整音频延迟并确保所有设备仍保持同步。

如果您使用自定义实现,则可以更改延迟,但 Apple 通常会拒绝它们。

查看这篇文章了解更多信息。您还可以阅读非官方的协议文档

于 2012-08-06T22:39:17.057 回答
4

简短的回答是:不,Apple 没有提供这样做的方法。假设您需要您的应用程序在 App Store 中获得批准,那么您有点不走运。如果您可以在越狱设备上运行您的应用程序,您可以四处搜索可以让您做更多事情的未记录 API。

如果您需要在 Apple 的 App Store 中提供您的应用程序,您可以通过网络执行的大多数操作都在“Reachability”示例应用程序中进行了概述。

我能想到的唯一方法是使用 Bonjour 来识别主机(请参阅此处的示例代码https://developer.apple.com/library/ios/#samplecode/BonjourWeb/Introduction/Intro.html ) 然后 ping 主机。

然而:

  • 如果有超过 1 个 Airplay 电台,您需要猜测或询问用户连接到哪个,或者取平均值。
  • 设备可能根本不响应 ping(Apple TV 和 Airport Express 都响应 ping,不确定第 3 方设备。)
  • ping 可能无法反映音频的实际延迟

与其在这方面花费太多时间,不如遵循 Apple 为 AirPlay 准备音频和丰富 AirPlay 应用程序的指南:http: //developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AirPlayGuide/ PreparingYourMediaforAirPlay/PreparingYourMediaforAirPlay.html#//apple_ref/doc/uid/TP40011045-CH4-SW1

希望这可以帮助!:)

于 2012-06-27T04:10:21.777 回答
2

您可以通过查询iOS当前的硬件音频延迟-[AVAudioSession outputLatency]

根据文件outputLatency

为您的音频内容使用支持 AirPlay 的设备可能会导致 2 秒延迟。检查游戏内容中的这种延迟。

根据我的经验,切换输出设备时此值会发生变化,例如:

  • 扬声器:~10ms
  • 蓝牙:~100+ms
  • 隔空播放:2 秒
于 2018-02-27T11:04:28.677 回答