gpt4 book ai didi

ios - 无法使用 AVPlayer 将 AudioSession 设置为非事件状态

转载 作者:搜寻专家 更新时间:2023-10-31 19:26:44 28 4
gpt4 key购买 nike

我正在使用 AVPlayer 在我的 iOS 应用程序中播放音频(因为我正在播放的音频文件不是本地的),当我的轨道结束时,我想隐藏信息中心控件,但我得到这个错误:

AVAudioSession.mm:1079:-[AVAudioSession setActive:withOptions:error:]:停用正在运行 I/O 的 Audio Session 。在停用 Audio Session 之前,应停止或暂停所有 I/O。

不过,我之前暂停了我的 AVPlayer

这是我的代码:

player.pause()
player.replaceCurrentItem(with: nil)

MPNowPlayingInfoCenter.default().nowPlayingInfo = nil
try? audioSession.setActive(false, options: .notifyOthersOnDeactivation)

由于这个错误, native 控件仍然可见,但不再工作。

enter image description here

最佳答案

失去锁定屏幕控件的快速方法是使您的 Audio Session 可混合(无需停用您的 Audio Session ):

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 个部分(这在某处有记录,this 是我现在能找到的最接近的东西,尽管关于它如何工作的最明确的文档是在系统日志中):

  1. 不可混合的 Audio Session 类别
  2. MPRemoteCommandCenter 集成
  3. 当前或“最近”完成的音频 IO

因此,如果您可以删除其中任何一个,锁定屏幕控件应该会消失。

关于ios - 无法使用 AVPlayer 将 AudioSession 设置为非事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56132974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com