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

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

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

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

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

Благодарю.

  • AVPlayer, создающий посторонний HTTP-запрос до воспроизведения HLS / AES-зашифрованного видео
  • AVPlayer audioSessionGotИзмененное уведомление при пробуждении с фона
  • AVPlayer статус всегда AVPlayerStatusReadyToPlay
  • GPUImageMovie использует несколько изображений в качестве текстур и процессов
  • Как отключить кнопки воспроизведения / паузы Центра управления?
  • Отправить заголовки с запросом AVPlayer в iOS
  • Почему AVPlayer терпит неудачу с статусом «playbackBufferEmpty» сразу после «playbackLiciousToKeepUp»?
  • Получение AVPlayer для iOS 5 для отображения последнего кадра видео при завершении воспроизведения вместо черного экрана
  • 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 .

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

    Interesting Posts

    Тестирование Swift Unit и AVFoundation: как проверить наличие / отсутствие действительного устройства захвата?

    Преобразование строки в int

    Настройка конфигурации NSURLSession sharedSession

    Сбой приложения Swift с «непризнанным селектором, отправленным в экземпляр» на CLLocationManager

    Как уменьшить обрезание при воспроизведении аудио с помощью трансляции?

    #ifdef #else #endif выбрать версию и функцию iOS sdk?

    UIGestureRecognizer получает прикосновение, но перенаправляет его на UIControl.

    Как я могу вручную создать дамп ядра (или эквивалент) в lldb, подключенный к iOS

    MKMapView setRegion не работает

    Как я могу оживить размер UICollectionViewCell на прокрутке, чтобы средний был самым большим?

    Исправление информации ISS Newsstand

    Как получить информацию о содержании (наброски) в формате PDF в iOS (iPad)?

    iOS Как реализовать контроллер отображения панели вкладок без выбора элемента панели вкладок?

    Как я могу начать разработку приложения на watchOS 3 SDK?

    как сортировать NSArray строк размера в iOS?

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