2014-06-09 13 views
41

Sto testando la mia app in XCode 6 e ho riscontrato un problema con AVAudioSession in iOS8.iOS8 AVAudioSession setActive error

Quando chiamo

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

ottengo il seguente messaggio di errore:

AVAudioSession.mm:623: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.

In AVAudioSession.h, si dice

Note that this method will throw an exception in apps linked on or after iOS 8 if the session is set inactive while it has running or paused I/O (e.g. audio queues, players, recorders, converters, remote I/Os, etc.).

Ma io non sono sicuro come può Controllo se c'è un I/O in esecuzione e come posso smaltire tutto quando ho bisogno di resettare la sessione audio.

+1

Puoi spiegare il contesto e fornire un caso d'uso per cui vuoi controllare se è in esecuzione I/O? – vladof81

+0

@vladof Se non ci sono errori di questo tipo, non è necessario verificare l'esecuzione dell'I/O. Quindi la situazione è, voglio assicurarmi che non ci sia nessun I/O in esecuzione quando chiamo setActive: NO – xialin

+0

Stai riparando questo? – Anton

risposta

10

Ho risolto questo problema inserendo questo codice nel metodo di AVAudioPlayerDelegate.

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

dove audioPlayer è una variabile dichiarata nell'intestazione della mia classe.

l'istruzione prepareToPlay dovrebbe risolvere il tuo problema!

+0

che ha risolto anche il mio problema !! Grazie!! – arjavlad

+1

non funziona per me in iOS 9.3: -/ – d4Rk

+0

@ d4Rk lo fa per me su iOS 9.3: '[stop audioPlayer]; [audioPlayer prepareToPlay]; [[AVAudioSession sharedInstance] setActive: NO error: nil]; ' –

0

ho pasueed mia AVPlayer prima AVAudioSession setactive NO;

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

1

state attenti. Se si sta riproducendo un film (anche senza audio e la traccia audio rimossa), verrà comunque creato un thread I/O che causerà sempre il lancio dell'errore sopra riportato.

1

Sto utilizzando AVAudioEngine e AVAudioPlayerNode per riprodurre suoni. Incontro lo stesso problema. Il mio ambiente è iOS 10.

Io uso AVAudioSession.sharedInstance() per gestire AVAudioSession. Quando eseguo la mia app nel simulatore tutto va bene, ma quando lo accendo al mio dispositivo. E 'fallito.

Suppongo che sto utilizzando la stessa sessione per gestire la registrazione e la riproduzione. Quindi potrebbe causare strani problemi. Nel mio caso, registro l'audio e ritarda 1 s per riprodurlo. Così, quando uso stopRecordingAudio(), aggiungo questo pezzo di codice:

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

Dopo ridefinire Audioengine, Audioengine era stato costretto a fermarsi e sessione è stata rilasciata. Crash non è mai più successo.

Spero che questo messaggio possa essere di aiuto.