我在XCode 6中测试我的应用程序,并在iOS8中发现了AVAudioSession的问题。
当我打电话
[[AVAudioSession sharedInstance] setActive:NO error:nil];
我收到以下错误消息:
AVAudioSession.mm:623: - [AVAudioSession setActive:withOptions:error:]: 停用已运行I / O的音频会话。所有的I / O应该是 在停用音频会话之前停止或暂停。
在AVAudioSession.h中,它说
请注意,如果会话在运行或暂停I / O时设置为非活动状态(例如音频队列,播放器,刻录机,转换器,远程),此方法将在iOS 8上或之后链接的应用中引发异常 I / O等。)。
但我不知道如何检查是否有运行的I / O以及如何在需要重置音频会话时将其全部丢弃。
答案 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秒也足够。这是一个不好的方法,但是我找不到更好的方法。如果有人知道如何检查播放器何时停止播放音频文件,请告诉我。