iOS8 AVAudioSession setActive error

后端 未结 5 1083
独厮守ぢ
独厮守ぢ 2020-12-28 12:00

I\'m testing my app in XCode 6 and find an issue with AVAudioSession in iOS8.

When I call

[[AVAudioSession sharedInstance] setActive:NO error

相关标签:
5条回答
  • 2020-12-28 12:48

    I pasued My AVplayer before AVAudioSession setActive NO;

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

    0 讨论(0)
  • 2020-12-28 13:01

    Swift 5, IOS 12

    I use AVPlayer, it does not have a prepareToPlay method. Therefore, Alessio Campanelli's answer does not solve my problem. But I noticed the following

    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
    

    After you call the pause method, the player plays the audio file for a while. Although other properties say that it is in a pause. So the only solution I found is

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

    In fact, even 0.1 seconds is sufficient. This is a bad way, but I could not find anything better. If anyone knows how to check when the player stops playing the audio file, let me know.

    0 讨论(0)
  • 2020-12-28 13:02

    I solved this problem, inserting this code in the method of AVAudioPlayerDelegate.

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

    where audioPlayer is a variable declared in the header of my class.

    the instruction prepareToPlay should resolve your problem!

    0 讨论(0)
  • 2020-12-28 13:02

    Be warned. If you are playing a movie (even with no sound and the audio track removed) then it will still create an I/O thread which will always cause the above error to be thrown.

    0 讨论(0)
  • 2020-12-28 13:06

    I'm using AVAudioEngine and AVAudioPlayerNode to play sounds. I meet the same problem. My environment is iOS 10.

    I use AVAudioSession.sharedInstance() to handle AVAudioSession. When I run my app in simulator everything is fine, but when I switch it to my device. It failed.

    I suppose that I'm using the same session to handle recording and playing. So it may cause some strange issues. In my case, I record the sound and delay 1s to play it. So when I use stopRecordingAudio(), I add this piece of code :

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

    After redefining audioEngine, audioEngine had been forced to stop and session was released. Crash is never happened again.

    Hope this message could help you.

    0 讨论(0)
提交回复
热议问题