web-dev-qa-db-ja.com

AirPlayレイテンシーの検出

AirPlayには固有のラグ/レイテンシーがあることに気づいていますが、(現在は架空の)iPhoneアプリがそのレイテンシーを検出する方法があるかどうか疑問に思っています。もしそうなら、そのレイテンシー値はどれくらい正確でしょうか?私は、アプリが単にそれを最小化するのではなく、それ自身のAirPlayレイテンシーを「知る」ことができるかどうかにもっと興味があります。

21
Jason Crystal

遅延はネットワークジッターによるものではなく、ソースデバイス(iPhone)によって決定されます。

短編小説:

  • Appleデバイスの場合、常に正確に2秒(ミリ秒まで)です。
  • パブリックAPIで微調整する方法はありません。

複数の出力を同期して再生できるように、オーディオのレイテンシーは非常に正確である必要があります。

AirPlayの実装に関するいくつかの説明:

  • プロトコルは、いくつかのRTSPコマンドで始まります。このハンドシェイク中に、ソースはrtpTimeを送信します。これは、再生が開始される時間であり、これはレイテンシーでもあります。通常の値は88200 = 2s x 44100Hzです。
  • AirPlayデバイスは、NTPを使用して、クロックをソースのクロックと同期し、ネットワーク遅延を軽減できます。
  • 再生中、ソースは定期的にSYNCパケットを送信してオーディオの遅延を調整し、すべてのデバイスがまだ同期していることを確認します。

カスタム実装を使用する場合、レイテンシーを変更することは可能ですが、Appleは通常それらを拒否します。

詳細については、これを確認してください writeup非公式のプロトコルドキュメント も読むことができます。

37
Laurent Perrin

簡単な答えは次のとおりです。いいえ、Appleはこれを行う方法を提供していません。AppStoreでアプリを承認する必要があると仮定すると、運が悪いことになります。ジェイルブレイクされたデバイスでアプリを実行でき、ドキュメント化されていないAPIを検索して、より多くのことを実行できます。

アプリをAppleのAppStoreで利用できるようにする必要がある場合、ネットワークに関して実行できるほとんどのことは、「到達可能性」サンプルアプリに概説されています。

良い推測を得るために私が考えることができる唯一の方法は、Bonjourを使用してホストを識別することです(ここのサンプルコードを参照してください https://developer.Apple.com/library/ios/#samplecode/BonjourWeb/Introduction /Intro.html )次に、ホストにpingを実行します。

しかしながら:

  • Airplayステーションが複数ある場合は、どのユーザーが接続しているかを推測または尋ねるか、平均を取る必要があります。
  • デバイスがpingにまったく応答しない場合があります(AppleTVとAirMacExpressはどちらもpingに応答しますが、サードパーティのデバイスについてはわかりません)。
  • Pingは、オーディオの実際の遅延を反映していない場合があります

これに多くの時間を費やす代わりに、AirPlay用にオーディオを準備してAirPlay用にアプリを強化するためのAppleのガイドラインに従う必要があります: http://developer.Apple.com/library/ios/#documentation/AudioVideo/ Conceptual/AirPlayGuide/PrepareingYourMediaforAirPlay/PrepareingYourMediaforAirPlay.html#// Apple_ref/doc/uid/TP40011045-CH4-SW1

お役に立てれば! :)

4
Aaron Brager

-[AVAudioSession outputLatency]で、iOSの現在のハードウェアオーディオレイテンシーを照会できます。

outputLatencyのドキュメントによると:

オーディオコンテンツにAirPlay対応デバイスを使用すると、2秒の遅延が発生する可能性があります。ゲームコンテンツのこの遅延を確認してください。

そして私の経験によれば、この値は出力デバイスを切り替えると変化します。例:

  • スピーカー:〜10ms
  • Bluetooth:〜100 + ms
  • AirPlay:2秒
2
naituw