iOS8 AVAudioSession set Error activo
xcode6 (4)
Estoy usando AVAudioEngine y AVAudioPlayerNode para reproducir sonidos. Me encuentro con el mismo problema. Mi entorno es iOS 10.
Uso AVAudioSession.sharedInstance()
para manejar AVAudioSession. Cuando ejecuto mi aplicación en el simulador todo está bien, pero cuando lo cambio a mi dispositivo. Falló.
Supongo que estoy usando la misma sesión para manejar la grabación y la reproducción. Por lo tanto, puede causar algunos problemas extraños. En mi caso, grabo el sonido y retraso 1s para reproducirlo. Entonces cuando uso stopRecordingAudio()
, agrego este fragmento de código:
if audioEngine.running {
audioEngine = AVAudioEngine() // var audioEngine = AVAudioEngine()
try! AVAudioSession.sharedInstance().setActive(false)
}
Después de redefinir AudioEngine, audioEngine se vio obligado a detenerse y se lanzó la sesión. Crash nunca vuelve a suceder.
Espero que este mensaje pueda ayudarte.
Estoy probando mi aplicación en XCode 6 y encuentro un problema con AVAudioSession en iOS8.
Cuando llamo
[[AVAudioSession sharedInstance] setActive: NO error: nil];
Aparece el siguiente mensaje de error:
AVAudioSession.mm:623: - [AVAudioSession setActive: withOptions: error:]: Desactivar una sesión de audio que tiene E / S en ejecución. Todas las E / S deben detenerse o pausarse antes de desactivar la sesión de audio.
En AVAudioSession.h, dice
Tenga en cuenta que este método arrojará una excepción en las aplicaciones vinculadas a iOS 8 o posteriores si la sesión está inactiva mientras tiene E / S en ejecución o en pausa (por ejemplo, colas de audio, reproductores, grabadoras, conversores, E / S remotas, etc.) .
Pero no estoy seguro de cómo puedo verificar si hay E / S funcionando y cómo puedo deshacerme de todo cuando necesito reiniciar la sesión de audio.
Pasé Mi AVplayer antes de que AVAudioSession establezcaActive NO;
[self.audioPlayer pause]; [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];
Resolví este problema, insertando este código en el método de AVAudioPlayerDelegate.
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
[audioPlayer stop];
[audioPlayer prepareToPlay];
}
donde AudioPlayer es una variable declarada en el encabezado de mi clase.
¡la instrucción prepareToPlay debería resolver su problema!
Ten cuidado. Si está reproduciendo una película (incluso sin sonido y sin la pista de audio), seguirá creando un hilo de E / S que siempre provocará el error anterior.