Обнаруживать, когда AVAudioSession "Ducked"

Я работаю над приложением Podcast. Это воспроизводит аудио, используя AVAudioSessionCategoryPlayback сеанса AVAudioSessionCategoryPlayback . Это делает почти все, что я хочу сделать. Он приостанавливает другую музыку, ее прерывают, когда приходит вызов и вообще работает точно так, как я хочу.

За одним исключением. Когда воспроизводится звук с более высоким приоритетом (например, при запуске приложения «от поворота к повороту»), звук в моем приложении сбрасывается громкостью, но продолжает работать. Это создает ужасное смешивание двух голосов, которые нежелательны. Вместо этого я предпочел бы, чтобы звук в моем приложении приостанавливался во время переигранного звука, а затем продолжайте снова, как только он закончится.

Я попытался изменить различные свойства AVAudioSessionCategoryOptionMixWithOthers , такие как AVAudioSessionCategoryOptionMixWithOthers , но они только изменяют, как звуки с более низким приоритетом смешиваются с моим приложением. Они не меняют, как моя смешивается с более высокоприоритетными звуками. Я также пробовал наблюдать за свойством otherAudioPlaying для sharedSession но это не сработало, когда я эти короткие клипы накладываются.

Есть ли способ обнаружить, когда звук в моем приложении уклоняется, чтобы я мог вместо этого сделать паузу? Или, альтернативно, чтобы предотвратить удержание звука моего приложения, чтобы он воспринимал эти другие звуки как прерывания?

Благодарю.

  • Мой AVPlayer не должен возобновляться с последней точки для LIVE Streaming
  • UIEvents, отправленные с Apple TV при использовании внешнего режима воспроизведения AVPlayer
  • iOS - Как я могу получить продолжительность воспроизведения AVPlayer
  • Невозможно остановить AVPlayer
  • Проблемы с потоковой музыкой iOS AVPlayer
  • Настройка videoGravity для AVLayerVideoGravityResizeAspectFill не влияет на iOS 5.0
  • AVPlayerItem не может быть связан с несколькими экземплярами AVPlayer '
  • iOS: AVPlayer - получение моментального снимка текущего кадра видео
  • 5 Solutions collect form web for “Обнаруживать, когда AVAudioSession "Ducked"”

    В классе AppDelegate.m и в функции didFinishLaunchingWithOptions прослушайте следующее уведомление

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruption:) name:AVAudioSessionInterruptionNotification object:nil]; 

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

     - (void)audioSessionInterruption:(NSNotification *)notif{ NSLog(@"\n\nInterruption Notification :%@\n\n",notif.userInfo); } 

    Надеюсь, это сработает для вас ….

    Я никогда этого не делал, но, я думаю, вы могли бы использовать функцию AudioSession для функции Cs audioSessionAddPropertyListener, чтобы зарегистрировать ваш обратный вызов для kAudioSessionSphere_OtherAudioIsPlaying.

    Имейте в виду, что есть некоторая путаница в документации «FLATDACTED» и Apple DevForums о возможности того, что все или некоторые функции AudioSession C устарели «в будущем».

    Возможно, вы захотите просмотреть прерывания и просто отбросьте свой аудиосеанс при прерванном воспроизведении, а затем возобновите его, когда прерывание закончится следующим образом:

    В 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 } } 

    Надеюсь, поможет.

    Я не верю, что kAudioSessionSphereStyleProperty_OtherAudioIsPlaying должен каким-либо образом перезвонить – возможно, вам придется регулярно публиковать это значение.

    Он должен возвращать ненулевое значение, когда другой звук воспроизводится на устройстве. Это может не указывать на то, что вы «нырнули» как таковой, но это будет означать, что другой звук смешивается с вашим аудио. Предположительно, вы были бы только уклонились, если другое приложение установило свойство kAudioSessionProperty_OtherMixableAudioShouldDuck своего аудиозанятия.

    Что касается опроса – да, это может быть не так элегантно, как обратный вызов, но иногда это необходимо, и я подозреваю, что это значение является незначительным.

    Надеюсь это поможет.

    Я написал в Apple DTS об этой проблеме. Вот что я вернулся:

    Благодарим вас за обращение в службу технической поддержки Apple Developer (DTS). Наши инженеры рассмотрели ваш запрос и пришли к выводу, что нет поддерживаемого способа достижения желаемой функциональности, учитывая текущие конфигурации системы доставки.

    Если вы хотите, чтобы Apple рассмотрела возможность добавления поддержки в будущем, чтобы разрешить / уведомить фоновое приложение о прекращении воспроизведения звука, когда приложение переднего плана решит укусить другое аудио, затем включите фоновое приложение, чтобы снова запустить звук после завершения уклонения, пожалуйста, отправьте с помощью инструмента «Репортер ошибок» по адресу http://bugreport.apple.com .

    Кажется, что это невозможно сейчас, к сожалению.

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.