Подтвердить что ты не робот

IOS8 AVAudioSession setActive error

Я тестирую свое приложение в XCode 6 и обнаруживаю проблему с AVAudioSession в iOS8.

Когда я звоню

[[AVAudioSession sharedInstance] setActive: NO error: nil];

Появляется следующее сообщение об ошибке:

AVAudioSession.mm:623: - [AVAudioSession setActive: withOptions: error:]: Отключение звукового сеанса, в котором запущены операции ввода-вывода. Все I/O должны быть остановлен или приостановлен до деактивации аудио сессии.

В AVAudioSession.h говорится:

Обратите внимание, что этот метод генерирует исключение в приложениях, связанных с iOS 8 или после него, если сеанс неактивен, когда он запускает или приостанавливает ввод-вывод (например, очереди аудио, проигрыватели, рекордеры, преобразователи, удаленные I/O и т.д.).

Но я не уверен, как я могу проверить, есть ли работающий ввод-вывод и как я могу распоряжаться всем, когда мне нужно reset сеанс аудио.

4b9b3361

Ответ 1

Я решил эту проблему, вставив этот код в метод AVAudioPlayerDelegate.

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
  [audioPlayer stop];
  [audioPlayer prepareToPlay];
}

где audioPlayer - это переменная, объявленная в заголовке моего класса.

инструкция prepareToPlay должна решить вашу проблему!

Ответ 2

Будьте предупреждены. Если вы воспроизводите фильм (даже без звука и удаленной звуковой дорожки), он все равно будет создавать поток ввода-вывода, который всегда будет вызывать выброс указанной выше ошибки.

Ответ 3

Я использую AVAudioEngine и AVAudioPlayerNode для воспроизведения звуков. Я встречаю ту же проблему. Моя среда - iOS 10.

Я использую AVAudioSession.sharedInstance() для обработки AVAudioSession. Когда я запускаю свое приложение в симуляторе, все в порядке, но когда я переключу его на свое устройство. Это не удалось.

Я полагаю, что я использую один и тот же сеанс для записи и воспроизведения. Так что это может вызвать некоторые странные проблемы. В моем случае я записываю звук и задерживаю 1s, чтобы воспроизвести его. Поэтому, когда я использую stopRecordingAudio(), я добавляю этот фрагмент кода:

if audioEngine.running {
    audioEngine = AVAudioEngine() // var audioEngine = AVAudioEngine()
    try! AVAudioSession.sharedInstance().setActive(false)
}

После переопределения audioEngine, audioEngine был вынужден остановить и сеанс был освобожден. Сбой никогда не повторится.

Надеемся, что это сообщение вам поможет.

Ответ 4

Я выполнил свой AVplayer перед установкой AVAudioSessionActive NO ;

[self.audioPlayer pause]; [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];

Ответ 5

Swift 5, IOS 12

Я использую AVPlayer, у него нет метода prepareToPlay. Поэтому ответ Алессио Кампанелли не решает мою проблему. Но я заметил следующее

player.pause()

print("currentTime:",  player.currentTime().seconds) //currentTime: 4.258164744
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0

sleep(1)

print("currentTime:",  player.currentTime().seconds) //currentTime: 4.261325767
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0

После вызова метода паузы проигрыватель некоторое время воспроизводит аудиофайл. Хотя другие свойства говорят, что это в паузе. Так что единственное решение, которое я нашел, это

player.pause()
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch let error {
        print(error)
    }
}

На самом деле, даже 0,1 секунды достаточно. Это плохой способ, но я не мог найти ничего лучше. Если кто-нибудь знает, как проверить, когда проигрыватель перестает воспроизводить аудиофайл, дайте мне знать.