AVAudioSessionDelegate вызывается в endInterruption, но beginInterruption не вызывается
Я настраиваю AVAudioSession, когда приложение запускает и устанавливает делегата в appDelegate. Кажется, что все работает (воспроизведение и т.д.), За исключением того, что beginInterruption на делегате не вызывается, когда телефон принимает вызов. Когда вызов заканчивается endInterrupt вызывается, хотя.
Единственное, что у меня есть, это то, что код аудиоплеера, который я использую, используется на основе AVAudioPlayer, но теперь использует AVPlayer. Обратные вызовы для делегата AVAudioPlayer для обработки прерываний все еще существуют, но кажется странным, что они каким-либо образом конфликтуют.
Ответы
Ответ 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 это исправлено, и мне еще нужно обновить, поэтому мы увидим.