wake-up-neo.com

iOS8 AVAudioSession setActive-Fehler

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

Wenn ich anrufe 

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

Ich erhalte folgende Fehlermeldung:

AVAudioSession.mm:623: - [AVAudioSession setActive: withOptions: Fehler:]: Deaktivieren einer Audiositzung, auf der E/A ausgeführt wird. Alle E/A sollten .__ sein. vor dem Deaktivieren der Audiositzung gestoppt oder angehalten.

In AVAudioSession.h heißt es

Beachten Sie, dass diese Methode in Apps, die auf oder nach iOS 8 verlinkt sind, eine Ausnahme auslöst, wenn die Sitzung deaktiviert ist, während die E/A ausgeführt wurde (z. B. Audio-Warteschlangen, Player, Rekorder, Konverter, Remote. usw.).

Ich bin mir jedoch nicht sicher, wie ich überprüfen kann, ob E/A ausgeführt wird, und wie kann ich alles erledigen, wenn ich die Audiositzung zurücksetzen muss.

41
xialin

Ich habe dieses Problem gelöst und diesen Code in die Methode von AVAudioPlayerDelegate eingefügt.

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

dabei ist audioPlayer eine im Header meiner Klasse deklarierte Variable.

die Anweisung prepareToPlay sollte Ihr Problem lösen!

10

Sei gewarnt. Wenn Sie einen Film abspielen (auch wenn kein Ton vorhanden ist und die Audiospur entfernt ist), wird immer noch ein E/A-Thread erstellt, der immer dazu führt, dass der obige Fehler ausgelöst wird.

1
Aggressor

Ich benutze AVAudioEngine und AVAudioPlayerNode, um Sounds abzuspielen. Ich habe das gleiche Problem. Meine Umgebung ist iOS 10.

Ich verwende AVAudioSession.sharedInstance(), um mit AVAudioSession umzugehen. Wenn ich meine App im Simulator starte, ist alles in Ordnung, aber wenn ich sie auf mein Gerät umstelle. Es ging schief.

Ich nehme an, dass ich dieselbe Session verwende, um Aufnahme und Wiedergabe zu erledigen. So kann es zu seltsamen Problemen kommen. In meinem Fall nehme ich den Sound auf und verzögere die Wiedergabe um 1s. Wenn ich stopRecordingAudio() benutze, füge ich diesen Code hinzu:

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

Nach der Neudefinition von audioEngine musste audioEngine stoppen und die Sitzung wurde freigegeben. Crash ist nie wieder passiert.

Hoffe, diese Nachricht könnte dir helfen.

1

Ich habe meinen AVplayer vor AVAudioSession setActive NO as verpasst

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

0
Trouble maker

Swift 5, IOS 12

Ich verwende AVPlayer , es gibt keine prepareToPlay Methode. Deshalb löst Alessio Campanellis Antwort mein Problem nicht. Aber mir ist folgendes aufgefallen

player.pause()

print("currentTime:",  player.currentTime().seconds) //currentTime: 4.258164744
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0

sleep(1)

print("currentTime:",  player.currentTime().seconds) //currentTime: 4.261325767
print("status:", player.status.rawValue) //status: 1 (readyToPlay)
print("timeControlStatus:", player.timeControlStatus.rawValue) //timeControlStatus: 0 (paused)
print("rate:", player.rate) //rate: 0.0

Nachdem Sie die Methode Pause aufgerufen haben, spielt der Player die Audiodatei eine Weile ab. Obwohl andere Eigenschaften sagen, dass es in einer Pause ist. Die einzige Lösung, die ich gefunden habe, ist

player.pause()
DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
    do {
        try AVAudioSession.sharedInstance().setActive(false)
    } catch let error {
        print(error)
    }
}

Tatsächlich sind sogar 0,1 Sekunden ausreichend. Das ist ein schlechter Weg, aber ich könnte nichts besseres finden. Wenn jemand weiß, wie er überprüfen kann, wann der Player die Wiedergabe der Audiodatei beendet, lassen Sie es mich wissen.

0
nowhale