Невозможно установить AudioSession неактивным с AVPlayer - PullRequest
4 голосов
/ 14 мая 2019

Я использую AVPlayer для воспроизведения звука в моем приложении для iOS (поскольку воспроизводимые мной аудиофайлы не являются локальными), и когда моя дорожка заканчивается, я хочу скрыть элементы управления InfoCenter, но я получаю эту ошибку :

AVAudioSession.mm:1079:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

Я, однако, делаю паузу в AVPlayer раньше.

Это мой код:

player.pause()
player.replaceCurrentItem(with: nil)

MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
try? audioSession.setActive(false, options: .notifyOthersOnDeactivation)

Из-за этой ошибки собственные элементы управления остаются видимыми, но больше не работают.

enter image description here

Ответы [ 4 ]

2 голосов
/ 27 мая 2019

Быстрый способ потерять элементы управления экрана блокировки - сделать ваш аудио сеанс смешиваемым ( без деактивации вашего аудио сеанса):

try! AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: .mixWithOthers)

Удалите .mixWithOthers, когда хотитеих обратно.

Другой, возможно, более приемлемый способ - удалить ваши MPRemoteCommandCenter цели, как только вы приостановите воспроизведение.например, если вы установите его так:

var playTarget: Any? = nil
var pauseTarget: Any? = nil

func addRemoteTargets() {
    let commandCenter = MPRemoteCommandCenter.shared()

    playTarget = commandCenter.playCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
        print("play \(event)")
        return .success
    }

    pauseTarget = commandCenter.pauseCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
        print("pause \(event)")
        return .success
    }
}

Затем удалите цели следующим образом:

func removeRemoteTargets() {
    let commandCenter = MPRemoteCommandCenter.shared()
    commandCenter.playCommand.removeTarget(playTarget)
    playTarget = nil
    commandCenter.pauseCommand.removeTarget(pauseTarget)
    pauseTarget = nil
}

ps это "похоже, работает!"ответы.Я не знаю, как вы должны определить, когда AVPlayer завершил свой аудио-ввод / вывод (кроме опроса с ошибкой setActive:false).Я рассуждаю о том, что становление экрана блокировки / «Now Playing App» состоит из 3 частей (это где-то где-то задокументировано, this - самая близкая вещь, которую я могу найти к этому сейчас, хотя самая явная документациякак это работает, в системных журналах):

  1. категория не аудио микшируемых аудио сеансов
  2. MPRemoteCommandCenter интеграция
  3. текущий или "недавно" законченный аудио IO

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

1 голос
/ 21 мая 2019

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

play.pause()
player = nil

, но вы должны сначала объявить ваш плеер как дополнительный.Ваш вопрос связан с: Невозможно остановить AVPlayer

0 голосов
/ 27 мая 2019

Попробуйте

1002 *
0 голосов
/ 25 мая 2019

Вы должны удалить

player.replaceCurrentItem(with: nil)
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil

Только сохранить это

player.pause()
try? audioSession.setActive(true, options: .notifyOthersOnDeactivation)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...