Обнаруживать, когда AVAudioSession "Ducked"
Я работаю над приложением Podcast. Это воспроизводит звук, используя тип сеанса AVAudioSessionCategoryPlayback
. Это делает почти все, что я хочу сделать. Он приостанавливает другую музыку, ее прерывают, когда приходит вызов и вообще работает точно так, как я хочу.
С исключением one. Когда воспроизводится звук с более высоким приоритетом (например, при запуске приложения "от поворота к повороту" ), звук в моем приложении сбрасывается громкостью, но продолжает работать. Это создает ужасное смешивание двух голосов, которые нежелательны. Вместо этого я предпочел бы, чтобы звук в моем приложении приостанавливался во время переигранного звука, а затем продолжайте снова, как только он закончится.
Я попробовал изменить различные свойства AVAudioSession, такие как AVAudioSessionCategoryOptionMixWithOthers
, но они изменяют только то, как звуки с более низким приоритетом смешиваются с моим приложением. Они не меняют, как моя смешивается с более высокоприоритетными звуками. Я также пробовал наблюдать свойство otherAudioPlaying
sharedSession
, но это не сработало, когда я эти короткие клипы накладываются.
Есть ли способ обнаружить, когда звук в моем приложении уклоняется, чтобы я мог вместо этого сделать паузу? Или, альтернативно, чтобы предотвратить утечку звука моего приложения, чтобы он воспринимал эти другие звуки как прерывания?
Спасибо.
Ответы
Ответ 1
В функции AppDelegate.m
Class и didFinishLaunchingWithOptions
выслушайте следующее уведомление
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil];
и вне метода запуска приложения, установите селектор как
- (void)audioSessionInterruption:(NSNotification *)notif{
NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo);
}
Надеюсь, это сработает для вас....
Ответ 2
Я никогда не делал этого, но, я думаю, вы могли бы использовать функцию AudioSession для функции cs audioSessionAddPropertyListener для регистрации вашего обратного вызова для kAudioSessionProperty_OtherAudioIsPlaying.
Имейте в виду, что есть некоторая путаница в документации "FLATDACTED" и Apple DevForums о возможности того, что все или некоторые функции AudioSession C устарели "в будущем".
Ответ 3
Возможно, вы захотите просмотреть прерывания и просто отбросьте свой аудиосеанс при прерванном воспроизведении, а затем возобновите его, когда прерывание закончится следующим образом:
В вашей ViewDidLoad:
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
if ([self canBecomeFirstResponder]) {
[self becomeFirstResponder];
}
Обработать уведомления:
static NSInteger audioSessionActiveCounter = 0;
- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification
{
AVAudioSessionInterruptionType interruptionType = [[[notification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];
if (AVAudioSessionInterruptionTypeBegan == interruptionType)
{
DDLogVerbose(@"Session interrupted: --- Begin Interruption ---");
// stop your session here with a setActive:NO
}
else if (AVAudioSessionInterruptionTypeEnded == interruptionType)
{
DDLogVerbose(@"Session interrupted: --- End Interruption ---");
// resume your session here with a setActive:YES
}
}
Надеюсь, что это поможет.
Ответ 4
Я не верю, что kAudioSessionSetServiceProperty_OtherAudioIsPlaying должен каким-либо образом перезвонить - возможно, вам придется регулярно публиковать это значение.
Он должен вернуть ненулевое значение, когда на устройстве воспроизводится другое аудио. Это может не указывать на то, что вы "нырнули" как таковой, но это будет означать, что другой звук смешивается с вашим аудио. Предположительно, вы были бы только уклонились, если другое приложение установило свойство kAudioSessionProperty_OtherMixableAudioShouldDuck для их сеанса аудио.
Относительно опроса - да, это может быть не так элегантно, как обратный вызов, но иногда это необходимо, и я подозреваю, что это значение является незначительным.
Надеюсь, что это поможет.
Ответ 5
Я написал в Apple DTS об этой проблеме. Вот что я вернулся:
Благодарим вас за обращение в службу технической поддержки Apple Developer (DTS). наш инженеры рассмотрели ваш запрос и пришли к выводу, что есть нет поддерживаемого способа достижения желаемой функциональности, учитывая в настоящее время отправляет конфигурации системы.
Если вы хотите, чтобы Apple рассмотрела возможность добавления поддержки в будущем разрешить/уведомить фоновое приложение о прекращении воспроизведения звука, когда приложение переднего плана выбирает укупить другое аудио, затем включить фон приложение, чтобы снова запустить звук после завершения уклонения, пожалуйста, отправьте запроса улучшения через инструмент Bug Reporter в http://bugreport.apple.com.
Кажется, что это невозможно сейчас, к сожалению.