2014-06-09 11 views
41

Ich teste meine App in XCode 6 und finde ein Problem mit AVAudioSession in iOS8.iOS8 AVAudioSession setActive Fehler

Als ich

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

nennen bekomme ich folgende Fehlermeldung:

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, heißt es

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.).

Aber ich bin nicht sicher, wie kann Ich überprüfe, ob I/O läuft und wie kann ich alles entfernen, wenn ich die Audio Session zurücksetzen muss.

+1

Können Sie den Kontext erklären und einen Anwendungsfall angeben, warum Sie überprüfen möchten, ob I/O ausgeführt wird? – vladof81

+0

@vladof Wenn es keinen solchen Fehler gibt, muss ich nicht überprüfen, ob I/O läuft. So die Situation ist, möchte ich sicherstellen, dass es keine laufenden I/O, wenn ich setActive aufrufen: Nein – xialin

+0

Sind Sie das beheben? – Anton

Antwort

10

Ich löste dieses Problem und fügte diesen Code in die Methode von AVAudioPlayerDelegate ein.

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

wo audioPlayer ist eine Variable in der Kopfzeile meiner Klasse deklariert.

Die Anweisung prepareToPlay sollte Ihr Problem lösen!

+0

das löste mein Problem auch !! Vielen Dank!! – arjavlad

+1

funktioniert nicht für mich in iOS 9.3: -/ – d4Rk

+0

@ d4Rk tut es für mich auf iOS 9.3: '[audioPlayer stop]; [audioPlayer prepareToPlay]; [[AVAudioSession sharedInstance] setActive: NO Fehler: nil]; ' –

0

pasueed ich meine avplayer vor AVAudioSession setActive NO;

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

1

gewarnt. Wenn Sie einen Film abspielen (auch ohne Ton und die Audiospur entfernt), wird immer noch ein I/O-Thread erstellt, der immer den obigen Fehler verursacht.

1

Ich verwende AVAudioEngine und AVAudioPlayerNode, um Sounds zu spielen. Ich habe das gleiche Problem. Meine Umgebung ist iOS 10.

Ich verwende AVAudioSession.sharedInstance(), um AVAudioSession zu behandeln. Wenn ich meine App im Simulator laufe, ist alles in Ordnung, aber wenn ich es auf mein Gerät umstelle. Es ging schief.

Ich nehme an, dass ich die gleiche Sitzung verwende, um Aufnahme und Wiedergabe zu behandeln. Es kann also zu seltsamen Problemen kommen. In meinem Fall nehme ich den Ton auf und verzögere 1s, um ihn abzuspielen. Also, wenn ich stopRecordingAudio() verwenden, ich dieses Stück Code hinzufügen:

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

Nach Audioengine neu definiert hatte Audioengine gezwungen, zu stoppen und Sitzung veröffentlicht wurde. Crash ist nie wieder passiert.

Ich hoffe, diese Nachricht könnte Ihnen helfen.