2014-06-09 12 views
41

Testuję swoją aplikację w XCode 6 i znajduję problem z AVAudioSession w iOS8.iOS8 AVAudioSession setActive error

Kiedy zadzwonić

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

pojawia się następujący komunikat o błędzie:

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.

W AVAudioSession.h, mówi

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

ale nie jestem pewien, w jaki sposób Sprawdzam, czy działa I/O i jak mogę pozbyć się wszystkiego, gdy trzeba zresetować sesję audio.

+1

Czy możesz wyjaśnić kontekst i podać przypadek użycia, dlaczego chcesz sprawdzić, czy działa I/O? – vladof81

+0

@vladof Jeśli nie ma takiego błędu, nie muszę sprawdzać działania I/O. Tak więc sytuacja polega na tym, że chcę się upewnić, że nie ma działających operacji we/wy, gdy zadzwonię do setActive: NIE – xialin

+0

Naprawiłeś to? – Anton

Odpowiedz

10

Rozwiązałem ten problem, wstawiając ten kod w metodę AVAudioPlayerDelegate.

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

gdzie audioPlayer jest zmienną zadeklarowaną w nagłówku mojej klasy.

Instrukcja Tutorial pomoże rozwiązać problem!

+0

, który rozwiązał mój problem !! dzięki!! – arjavlad

+1

nie działa dla mnie w iOS 9.3: -/ – d4Rk

+0

@ d4Rk robi to dla mnie na iOS 9.3: '[stop audio player]; [audioPlayer prepareToPlay]; [[AVAudioSession sharedInstance] setActive: NO error: nil]; ' –

0

I pasueed mój avplayer przed AVAudioSession setActive NO;

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

1

uważajcie. Jeśli odtwarzasz film (nawet bez dźwięku i ścieżki dźwiękowej usuniętej), to utworzy on wątek wejścia/wyjścia, który zawsze spowoduje zgłoszenie powyższego błędu.

1

Używam AVAudioEngine i AVAudioPlayerNode do odtwarzania dźwięków. Spotykam ten sam problem. Moje środowisko to iOS 10.

Używam AVAudioSession.sharedInstance() do obsługi AVAudioSession. Kiedy uruchomię swoją aplikację na symulatorze, wszystko jest w porządku, ale kiedy przełączę ją na moje urządzenie. Nie powiodło się.

Przypuszczam, że używam tej samej sesji do obsługi nagrywania i odtwarzania. Może to powodować pewne dziwne problemy. W moim przypadku nagrywam dźwięk i opóźniam 1s, aby go odtworzyć. Więc kiedy używam stopRecordingAudio() dodam ten kawałek kodu:

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

Po redefinicji Audioengine, Audioengine został zmuszony do zatrzymania się i sesja została wydana. Awaria nigdy się nie powtórzy.

Mam nadzieję, że ta wiadomość może ci pomóc.

Powiązane problemy