Подтвердить что ты не робот

AVAudioSessionDelegate вызывается в endInterruption, но beginInterruption не вызывается

Я настраиваю AVAudioSession, когда приложение запускает и устанавливает делегата в appDelegate. Кажется, что все работает (воспроизведение и т.д.), За исключением того, что beginInterruption на делегате не вызывается, когда телефон принимает вызов. Когда вызов заканчивается endInterrupt вызывается, хотя.

Единственное, что у меня есть, это то, что код аудиоплеера, который я использую, используется на основе AVAudioPlayer, но теперь использует AVPlayer. Обратные вызовы для делегата AVAudioPlayer для обработки прерываний все еще существуют, но кажется странным, что они каким-либо образом конфликтуют.

4b9b3361

Ответ 1

Глядя на заголовок, в iOS6, похоже, что AVAudioSessionDelegate теперь устарел.

Используйте AVAudioSessionInterruptionNotification вместо этого в iOS6.

Обновление: это не сработало. Я думаю, что есть ошибка в рамках.

Да, по моему опыту, beginInterruption, а также недавно зарегистрированная функция AVAudioSessionInterruptionNotification работает правильно. Я должен был следить за состоянием игрока, используя локальный флаг, а затем обрабатывать метод endInterruption:withFlags:, чтобы отслеживать восстановление после прерываний.

С iOS 6 возобновление от прерывания по крайней мере позволит вашему AudioPlayer в нужном месте, поэтому мне не нужно было хранить последнее известное время воспроизведения моего AVAudioPlayer, мне просто нужно было сыграть в игру.

Вот решение, с которым я столкнулся. Кажется, что iOS 6 убивает ваш звук медиа-носителем Reset, если AVPlayer остается слишком длинным. В результате происходит воспроизведение AVPlayer, но звук не появляется. Скорость на AVPlayer равна 1, но звука абсолютно нет. Чтобы добавить боль в ситуацию, нет никакой ошибки ни в AVAudioSession setActive, ни в самом AVPlayer, что указывает на наличие проблемы.

Добавьте к тому факту, что вы не можете зависеть от appWillResignActive, потому что ваше приложение может быть уже в фоновом режиме, если вы вообще зависите от жестов жесткого диска.

Последнее решение, которое я внедрил, - добавить периодического наблюдателя на AVPlayer и записать последнее известное время. Когда я получаю событие, в котором мне был предоставлен контроль, я создаю новый AVPlayer, загружаю его с помощью AVPlayerItem и seekToTime в нужное время.

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

Ответ 2

Я могу подтвердить, что с использованием C api метод прерывания также не вызывается, когда начинается прерывание; только когда он заканчивается

(AudioSessionInitialize (nil, nil, interruptionListenerCallback, (__bridge void *)(self));

Я также опубликовал отчет об ошибке с apple для проблемы.

Изменить: Это исправлено в iOS 6.1 (но не в iOS 6.0.1)

Ответ 3

Просто позвоните:

[[AVAudioSession sharedInstance] setDelegate: self];

Ответ 4

Я только что проверил свой iPhone 5 (под управлением iOS 6.0), установив точку останова в функции обратного вызова AudioSessionInterruptionListener, которая была объявлена ​​в AudioSessionInitialize(), и этот обратный вызов прерывания действительно вызывает вызов, когда приложение имеет активный звук сеансового и аудиоустройства и прерывается входящим телефонным звонком (Xcode показывает, что приложение остановилось в точке прерывания в начале прерывания, которое я затем продолжаю).

У меня есть приложение, затем остановите его аудиоустройство и отключите его аудио сессию. Затем, при обратном вызове прерывания, приложение повторно активирует аудио сессию и без проблем перезапускает аудиоустройство (приложение записывает звук должным образом после этого).

Ответ 5

Я построил совершенно новое приложение для потоковой передачи аудио (AVPlayer) на iOS 6.0.x и нашел ту же проблему.

Делегаты теперь устарели, и мы должны использовать уведомления, которые замечательно, однако здесь мои выводы:

  • Во время входящего звонка я получаю только AVAudioSessionInterruptionTypeEnded в моем обработчике, а также AVAudioSessionInterruptionOptionShouldResume. Аудио-сессия автоматически приостанавливается (звук исчезает), и мне просто нужно возобновить воспроизведение AVPlayer.
  • Однако, когда вы пытаетесь запустить игру, например, CSR Racing, я странно получаю страшный AVAudioSessionInterruptionTypeBegan, но без знака, когда мое приложение может возобновить воспроизведение, даже не убивая игру.

Теперь это может зависеть от других факторов, таких как моя категория аудио (в моем случае AVAudioSessionCategoryPlayback) и настройки микширования обоих приложений (kAudioSessionProperty_OverrideCategoryMixWithOthers), я не уверен, но определенно я вижу что-то места.

Надеюсь, что другие сообщили, что на 6.1beta это исправлено, и мне еще нужно обновить, поэтому мы увидим.