检测AirPlay延迟

21

尽管我知道AirPlay具有固有的延迟,但我想知道是否有一种方法可以让(当前假设的)iPhone应用程序检测该延迟是多少。如果可以,那么这种延迟值有多精确?我更好奇的是,一个应用程序是否可以“知道”自己的AirPlay延迟,而不仅仅是将其最小化。


3
发送一个短信,然后通过麦克风听取返回的声音? - trapper
我正在寻找预扬声器延迟。即信号在网络上传输所需的时间。等待扬声器和声学传输会增加额外的延迟,而这并不一定是我感兴趣的。谢谢! - Jason Crystal
3个回答

39

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

简而言之:

  • 对于苹果设备,它总是精确地保持在2秒(到毫秒级别)。
  • 公共API无法调整它。

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

AirPlay实现的一些解释:

  • 协议从几个RTSP命令开始。在此握手期间,源传输了rtpTime,即播放开始时间,也就是你的延迟时间。典型值为88200 = 2s x 44100 Hz。
  • AirPlay设备可以使用NTP与源进行时钟同步,以减轻网络延迟。
  • 在播放过程中,源会周期性地发送一个SYNC数据包来调整音频延迟,并确保所有设备仍然同步。

如果使用自定义实现,则可以更改延迟,但通常被苹果拒绝。

有关更多信息,请参见此文档。您还可以阅读非官方协议文档


感谢您提供的链接,Laurent。我一直在为这个延迟问题苦苦挣扎,而您的两秒评论解决了很多问题。看起来,通过Airplay的AVPlayer没有这种延迟,但有其他限制。 - amergin
太棒的参考资料!消除了一些不必要的神秘感,让这个功能更加 awesome 的掌控度更高。 - Dev Kanchen

4
简短的回答是:不,苹果没有提供这样的方法。假设您需要在App Store中获得批准,那么您可能会感到很无助。如果您可以在越狱设备上运行应用程序,则可以搜索未记录的API以执行更多操作。
如果您需要让您的应用程序在苹果的App Store中可用,那么大多数网络方面的操作都在“Reachability”示例应用程序中进行了说明。
我能想到的唯一获取良好猜测的方法是使用Bonjour来识别主机(请参见此处的示例代码https://developer.apple.com/library/ios/#samplecode/BonjourWeb/Introduction/Intro.html),然后对主机进行ping操作。
但是:
  • 如果有多个Airplay站点,则需要猜测或询问用户连接到哪个站点,或者取平均值。
  • 设备可能根本不会响应ping操作(Apple TV和Airport Express均会响应ping操作,但不确定第三方设备是否也会)
  • ping操作可能无法反映音频的实际延迟。

不要花太多时间在这上面,你应该遵循苹果的指南为AirPlay准备您的音频并丰富您的应用程序:http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AirPlayGuide/PreparingYourMediaforAirPlay/PreparingYourMediaforAirPlay.html#//apple_ref/doc/uid/TP40011045-CH4-SW1

希望这能帮到你!:)


3

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

根据outputLatency的文档:

使用支持AirPlay的设备播放音频内容可能会导致2秒的延迟。在游戏内容中检查此延迟。

根据我的实验,当切换输出设备时,这个值会发生变化,例如:

  • 扬声器:约10毫秒
  • 蓝牙:约100+毫秒
  • AirPlay:2秒

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接