Обнаружение задержки AirPlay - PullRequest
21 голосов
/ 03 апреля 2012

Хотя я понимаю, что AirPlay имеет присущую задержку / задержку, мне интересно, есть ли способ для (в настоящее время гипотетического) приложения для iPhone, чтобы определить, что это за задержка. Если да, то насколько точным может быть это значение задержки? Мне более любопытно, может ли приложение «знать» собственную задержку AirPlay, а не просто минимизировать ее.

Ответы [ 3 ]

36 голосов
/ 07 августа 2012

Задержка не связана с дрожанием сети, а определяется исходным устройством (вашим iPhone).

Короче говоря:

  • Это всегда точно 2 с (внизс точностью до миллисекунды) с устройствами Apple.
  • Невозможно настроить его с помощью общедоступных API.

Задержка звука должна быть очень точной, чтобы несколько выходов могли синхронизироваться.

Некоторые поясненияо реализации AirPlay:

  • Протокол начинается с нескольких команд RTSP.Во время этого рукопожатия источник передает rtpTime, время, когда начинается воспроизведение, которое также является вашей задержкой.Типичное значение: 88200 = 2 с x 44100 Гц.
  • Устройства AirPlay могут синхронизировать свои часы с источниками с NTP для уменьшения задержки в сети.
  • Во время воспроизведения источник периодически отправляет SYNC пакет для настройки задержки звука и обеспечения синхронизации всех устройств.

Можно изменить задержку, если вы используете пользовательскую реализацию, но Apple обычно отклоняет их.

Проверьте эту рецензию для получения дополнительной информации.Вы также можете прочитать неофициальную документацию .

4 голосов
/ 27 июня 2012

Краткий ответ: нет, Apple не предоставляет способ сделать это. Предполагая, что ваше приложение должно быть одобрено в App Store, вам не повезло. Если вы можете запустить свое приложение на взломанном устройстве, вы можете искать недокументированные API, которые позволят вам сделать больше.

Если вам нужно, чтобы ваше приложение было доступно в Apple App Store, большинство вещей, которые вы можете сделать в сети, описаны в примере приложения "Reachability".

Единственный способ придумать правильное предположение - использовать Bonjour для идентификации хоста (см. Пример кода здесь https://developer.apple.com/library/ios/#samplecode/BonjourWeb/Introduction/Intro.html) и затем пропинговать хост.

Тем не менее:

  • Если имеется более 1 станции Airplay, вам нужно будет угадать или спросить, к какому пользователь подключен, или, возможно, взять среднее значение.
  • Устройство может вообще не отвечать на эхо-запрос (Apple TV и Airport Express оба отвечают на эхо-запрос, но не уверены, что это устройства сторонних производителей.)
  • Пинг может не отражать фактическую задержку звука

Вместо того, чтобы тратить на это слишком много времени, вы должны следовать указаниям Apple по подготовке аудио для AirPlay и обогащению приложения для AirPlay: http://developer.apple.com/library/ios/#documentation/AudioVideo/Conceptual/AirPlayGuide/PreparingYourMediaforAirPlay/PreparingYourMediaforAirPlay.html#//apple_ref/doc/uid/TP40011045-CH4-SW1

Надеюсь, это поможет! :)

2 голосов
/ 27 февраля 2018

Вы можете запросить текущую аппаратную задержку звука iOS на -[AVAudioSession outputLatency],

В соответствии с документом для outputLatency:

Использование устройства с поддержкой AirPlay для вашего аудиоконтента можетпривести к 2-секундной задержке.Проверьте эту задержку в игровом контенте.

И, по моему опыту, это значение изменяется при переключении устройства вывода, например:

  • Динамик: ~ 10 мс
  • Bluetooth: ~ 100 + мс
  • AirPlay: 2 с
...