Je teste mon application dans XCode 6 et trouve un problème avec AVAudioSession dans iOS8.
Quand j’appelle
[[AVAudioSession sharedInstance] setActive: Aucune erreur: nil];
Je reçois le message d’erreur suivant:
AVAudioSession.mm:623: – [AVAudioSession setActive: withOptions: error:]: Désactiver une session audio exécutant des E / S. Toutes les E / S doivent être arrêtées ou interrompues avant de désactiver la session audio.
Dans AVAudioSession.h, il est dit
Notez que cette méthode déclenchera une exception dans les applications liées à iOS 8 ou après cette session si la session est désactivée lors de l’exécution d’E / S en cours d’exécution ou en pause (par exemple, files d’attente audio, lecteurs, enregistreurs, convertisseurs, E / S distantes, etc.) .
Mais je ne sais pas comment vérifier si des E / S sont en cours d’exécution et comment puis-je tout éliminer lorsque j’ai besoin de réinitialiser la session audio.
J’ai résolu ce problème en insérant ce code dans la méthode de AVAudioPlayerDelegate.
-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ [audioPlayer stop]; [audioPlayer prepareToPlay]; }
où audioPlayer est une variable déclarée dans l’en-tête de ma classe.
l’instruction prepareToPlay devrait résoudre votre problème!
Être averti. Si vous jouez un film (même sans son et que la piste audio a été supprimée), cela créera toujours un thread d’E / S qui provoquera toujours l’erreur ci-dessus.
J’utilise AVAudioEngine et AVAudioPlayerNode pour jouer des sons. Je rencontre le même problème. Mon environnement est iOS 10.
J’utilise AVAudioSession.sharedInstance()
pour gérer AVAudioSession. Lorsque je lance mon application dans le simulateur, tout va bien, mais quand je passe à mon appareil. Ça a échoué.
Je suppose que j’utilise la même session pour gérer l’enregistrement et la lecture. Donc, cela peut causer des problèmes étranges. Dans mon cas, j’enregistre le son et retarde 1s pour le jouer. Donc, quand j’utilise stopRecordingAudio()
, j’ajoute ce morceau de code:
if audioEngine.running { audioEngine = AVAudioEngine() // var audioEngine = AVAudioEngine() try! AVAudioSession.sharedInstance().setActive(false) }
Après avoir redéfini l’audioEngine, audioEngine avait été forcé de s’arrêter et la session a été libérée. Crash n’est jamais arrivé à nouveau.
J’espère que ce message pourrait vous aider.
J’ai suivi My AVplayer avant AVAudioSession setActive NO ;
[self.audioPlayer pause]; [[AVAudioSession sharedInstance] setActive:NO withOptions:AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation error:nil];