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 сеанс аудио.
Ответы
Ответ 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 секунды достаточно. Это плохой способ, но я не мог найти ничего лучше. Если кто-нибудь знает, как проверить, когда проигрыватель перестает воспроизводить аудиофайл, дайте мне знать.