iOS8 AVAudioSession setActive错误

时间:2014-06-09 05:44:21

标签: avaudiosession ios8 xcode6

我在XCode 6中测试我的应用程序,并在iOS8中发现了AVAudioSession的问题。

当我打电话

  

[[AVAudioSession sharedInstance] setActive:NO er​​ror:nil];

我收到以下错误消息:

   AVAudioSession.mm:623: - [AVAudioSession setActive:withOptions:error:]:   停用已运行I / O的音频会话。所有的I / O应该是   在停用音频会话之前停止或暂停。

在AVAudioSession.h中,它说

  

请注意,如果会话在运行或暂停I / O时设置为非活动状态(例如音频队列,播放器,刻录机,转换器,远程),此方法将在iOS 8上或之后链接的应用中引发异常   I / O等。)。

但我不知道如何检查是否有运行的I / O以及如何在需要重置音频会话时将其全部丢弃。

5 个答案:

答案 0 :(得分:9)

我解决了这个问题,将此代码插入AVAudioPlayerDelegate的方法中。

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

其中audioPlayer是我班级标题中声明的变量。

指令prepareToPlay应解决您的问题!

答案 1 :(得分:1)

警告。如果你正在播放一部电影(即使没有声音并删除了音轨),它仍然会创建一个I / O线程,它总是会引发上述错误。

答案 2 :(得分:1)

我使用AVAudioEngine和AVAudioPlayerNode播放声音。我遇到了同样的问题。我的环境是iOS 10。

我使用AVAudioSession.sharedInstance()来处理AVAudioSession。当我在模拟器中运行我的应用程序时,一切都很好,但是当我将它切换到我的设备时。它失败了。

我想我使用相同的会话来处理录制和播放。所以它可能会导致一些奇怪的问题。在我的情况下,我录制声音并延迟1秒播放它。因此,当我使用stopRecordingAudio()时,我添加了这段代码:

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

重新定义audioEngine后,audioEngine被迫停止并释放会话。崩溃永远不会再发生。

希望这条消息可以帮到你。

答案 3 :(得分:0)

我在AVAudioSession setActive NO;

之前发布了我的AV播放器

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

答案 4 :(得分:0)

Swift 5,IOS 12

我使用 AVPlayer ,它没有 prepareToPlay 方法。因此,Alessio Campanelli的answer无法解决我的问题。 但是我注意到了以下

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

调用暂停方法后,播放器会播放音频文件一段时间。尽管其他属性表明它处于暂停状态。 所以我找到的唯一解决方案是

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

实际上,即使只有0.1秒也足够。这是一个不好的方法,但是我找不到更好的方法。如果有人知道如何检查播放器何时停止播放音频文件,请告诉我。