web-dev-qa-db-fra.com

erreur iOS8 AVAudioSession setActive

Je teste mon application dans XCode 6 et trouve un problème avec AVAudioSession dans iOS8.

Quand j'appelle 

[[AVAudioSession sharedInstance] setActive: PAS d'erreur: nil];

Je reçois le message d'erreur suivant:

AVAudioSession.mm:623: - [AVAudioSession setActive: withOptions: error:]: Désactiver une session audio avec une E/S en cours d'exécution. Tous les E/S doivent être arrêté ou en pause avant de désactiver la session audio.

Dans AVAudioSession.h, il est indiqué

Notez que cette méthode lève une exception dans les applications liées sur ou après iOS 8 si la session est inactive pendant qu’elle a des E/S en cours d’exécution ou en pause (par exemple, files d’audio, lecteurs, enregistreurs, convertisseurs, télécommande etc.).

Mais je ne suis pas sûr de savoir comment puis-je vérifier si des E/S sont en cours d'exécution et comment puis-je en disposer lorsque je dois réinitialiser la session audio.

41
xialin

J'ai résolu ce problème en insérant ce code dans la méthode 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!

10

Être averti. Si vous lisez un film (même sans son et sans la piste audio), un thread d’entrée/sortie sera toujours créé, ce qui provoquera toujours la génération de l’erreur ci-dessus.

1
Aggressor

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 je la bascule sur mon appareil. Ça a échoué.

Je suppose que j'utilise la même session pour gérer l'enregistrement et la lecture. Cela peut donc causer des problèmes étranges. Dans mon cas, j'enregistre le son et retarde le jeu pour le jouer. Alors 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 audioEngine, audioEngine avait été forcé de s’arrêter et la session était libérée. Le crash n'est plus jamais arrivé.

J'espère que ce message pourrait vous aider.

1
CashLee李秉骏

Je suis passé devant mon AVplayer avant AVAudioSession setActive NO ;

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

0
Trouble maker