AVAudioPlayer, использующий сеанс AmbientSound, не воспроизводится, когда приложение находится в фоновом режиме - PullRequest
2 голосов
/ 07 января 2012

Если это в Apple DOC, то я не смог его найти - надеясь, что кто-то может помочь:

Мое приложение время от времени воспроизводит короткие аудиоклипы - я хочу, чтобы звук смешивался со звуком, воспроизводимым из других приложений в фоновом режиме, таких как приложение iPod, - но я также хочу, чтобы оно продолжало воспроизводить эти аудиоклипы, когда приложение работает в фон.

Я установил «Приложение воспроизводит аудио» в настройках «Необходимые фоновые режимы» в файле info.plist (приложение также использует службы определения местоположения, так что оно тоже там установлено)

Мое приложение настраивает аудиосеанс для приложенияDidFinishLaunching:

AudioSessionInitialize (NULL,NULL,NULL,NULL);
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,sizeof (sessionCategory),&sessionCategory); 
AudioSessionSetActive(true);

В моем viewWillAppear: метод в активном представлении у меня есть:

[super viewWillAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder]; 

и соответствующий обработчик события и код endReceivingRemoteControlEvents в viewWillDisappear: как обсуждалось в iOS 4: пульты дистанционного управления для фонового звука

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

bool successful = [avAudioPlayer play];
if(!successful)
    NSLog(@"did not play");

Когда приложение находится на переднем плане, приложение работает нормально и воспроизводит звук, но когда приложение переходит в фоновый режим и приложение пытается воспроизвести звук, возвращаемое значение из [avAudioPlayer play] равно NO, и звук не воспроизводится - при переключении на передний план звук снова начинает работать.

Если при настройке сеанса я вместо этого использую

    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;

Тогда звук отлично воспроизводится на переднем и заднем плане. Но MediaPlayback - не совсем подходящий режим для этого приложения, поскольку я только время от времени воспроизводю аудиоклипы - AmbientSound - действительно тот режим, который мне следует использовать.

Чего мне не хватает? Разве нельзя использовать kAudioSessionCategory_AmbientSound для воспроизведения аудио в фоновом режиме? Если так, я не нашел ничего в документации об этом.

1 Ответ

3 голосов
/ 10 января 2012

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

Согласно Apple, фоновое воспроизведение не поддерживается категорией AmbientSound - вы должны использовать MediaPlayback.

Они утверждают, что этонаходится в документации - я посмотрел еще раз и не смог его найти.

Хорошо, поэтому получение фоновых звуков для микширования в MediaPlayback достаточно просто с помощью kAudioSessionProperty_OverrideCategoryMixWithOthers - но теперь мне придется перепрыгивать через некоторые другиеобручи для репликации других функциональных возможностей AmbientSound (подчиняясь выключателю звука и не воспроизводясь при блокировке).Я действительно не понимаю, почему AmbientSound не поддерживается, играя в фоновом режиме - но мы идем.

...