我使用AVPlayer在我的iOS应用程序中播放音频(因为我正在播放的音频文件不是本地的),当我的音轨结束时,我想隐藏InfoCenter控件,但是我得到了以下错误:
AVAudioSession.mm:1079:-[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.
不过,我之前暂停了我的AVPlayer。
这是我的密码:
player.pause()
player.replaceCurrentItem(with: nil)
MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
try? audioSession.setActive(false, options: .notifyOthersOnDeactivation)由于此错误,本机控件仍然可见,但不再工作。

发布于 2019-05-27 08:29:59
丢失锁定屏幕控件的一种快速方法是使您的音频会话可混合(而不禁用您的音频会话):
try! AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: .mixWithOthers)当您想要将.mixWithOthers移除时,请删除它们。
另一种,也许更好的方法是,一旦暂停播放,就移除MPRemoteCommandCenter目标。如果你像这样设置它
var playTarget: Any? = nil
var pauseTarget: Any? = nil
func addRemoteTargets() {
let commandCenter = MPRemoteCommandCenter.shared()
playTarget = commandCenter.playCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
print("play \(event)")
return .success
}
pauseTarget = commandCenter.pauseCommand.addTarget { (event) -> MPRemoteCommandHandlerStatus in
print("pause \(event)")
return .success
}
}然后删除如下所示的目标:
func removeRemoteTargets() {
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.removeTarget(playTarget)
playTarget = nil
commandCenter.pauseCommand.removeTarget(pauseTarget)
pauseTarget = nil
}附注:这些都是“似乎有效!”答案。我不知道您应该如何确定AVPlayer何时完成其音频I/O (除了通过setActive:false失败进行轮询)。我的理由是,成为锁定屏幕/“现在播放应用程序”有3部分(这在某种程度上被记录在某个地方,这是我现在能找到的最接近它的东西,尽管在系统日志中最清楚地说明了它是如何工作的):
MPRemoteCommandCenter集成因此,如果您可以删除其中任何一个,锁定屏幕控件应该消失。
发布于 2019-07-29 11:51:22
AVPlayer不会立即停止,所以当它暂停时,您需要订阅它的状态更改来捕捉它。只有这样,您才能安全地禁用AVAudioSession。
Swift 5例
var timeControlObservation: NSKeyValueObservation?
timeControlObservation = player.observe(\.timeControlStatus, changeHandler: { [weak player] (_, _) in
guard let player = player else {
return
}
if player.timeControlStatus != .playing {
// Finish your work here
AVAudioSession.sharedInstance().setActive(false, options: .notifyOthersOnDeactivation)
timeControlObservation = nil
}
}
player.pause()发布于 2019-05-20 23:05:08
https://stackoverflow.com/questions/56132974
复制相似问题