Вопрос по avaudiosession, ios6.0, avplayer, ios – AVAudioSessionDelegate вызывается при endInterruption, но не вызывается beginInterruption

12

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

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

Я вижу то же самое только в iOS 6. Только что обновлен, но он не работает. Дайте мне знать, если вы решили это. David Morton
Вы видите проблему в iOS 5.x? farski
Как отмечено в моем ответе, это, кажется, исправлено в iOS 6.1. Не 6.0.1 однако .. sam_899
Эндрю, я попал в ту же ситуацию, ты смог ее решить? Ethan
Я все еще вижу проблемы с этим в 6.1.2. Когда прерывание действительно начинается, уведомление не публикуется. Когда прерывание действительно заканчивается,both Отправленные и Завершенные уведомления размещены. farski

Ваш Ответ

5   ответов
4

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

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

Я также подал отчет об ошибке в Apple для решения этой проблемы.

Edit: Это исправлено в iOS 6.1 (но не в iOS 6.0.1)

Не уверен, что есть проблема с настройкой вашего кода, но я вижу, что обратный вызов прерывания аудио сеанса вызывается, когда прерывание начинается на устройстве iOS 6.
при использовании удаленного ввода-вывода для прямой записи в AAC с использованием extAudioFile я наблюдаю такое поведение как на ios 6.0.1, так и на бета-версии 6.1. Кажется, что оно вообще не исправлено в коде 6.x
Проект, о котором я упоминал выше, корректно работает на ios 6.1 beta
Интересно - у меня естьuploaded the example Я послал яблоку - не могли бы вы попробовать и посмотреть, печатается ли NSLog, чтобы уведомить о начале прерывания? Было бы интересно узнать, настраиваете ли вы аудио сеансы по-другому?
0

AVPlayer) приложение поверх iOS 6.0.x и обнаружил такую же проблему.

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

During an incoming phone call I get only AVAudioSessionInterruptionTypeEnded in my handler, along with AVAudioSessionInterruptionOptionShouldResume. Audio session gets suspended automatically (audio fades) and I just need to resume playback of AVPlayer. However when attempting to launch a game, such as CSR Racing, I oddly get the dreaded AVAudioSessionInterruptionTypeBegan but no sign when my application can resume playback, not even killing the game.

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

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

2

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

[[AVAudioSession sharedInstance] setDelegate: self];
Что вызовет начало прерывания? farski
8

в iOS6 выглядит, что AVAudioSessionDelegate теперь устарела.

использованиеAVAudioSessionInterruptionNotification вместо этого в iOS6.

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

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

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

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

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

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

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

Согласовано. Кажется, что ни AVAudioSessionInterruptionNotification, ни AVAudioSessionRouteChangeNotification не работают! Я сообщил об ошибке в Apple и рекомендую другим сделать то же самое в надежде исправить этот API в 6.1.bugreport.apple.com/cgi-bin/WebObjects/RadarWeb.woa/wa/signIn
0

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

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

Мне кажется, что проблема появляется только тогда, когда мы кодируем напрямую в mpeg4aac. Любой другой кодек и все работает нормально. Что вы использовали в качестве формата файла?

Похожие вопросы