首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法用AudioSession设置非活动的AVPlayer

无法用AudioSession设置非活动的AVPlayer
EN

Stack Overflow用户
提问于 2019-05-14 14:36:08
回答 5查看 3.4K关注 0票数 8

我使用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

这是我的密码:

代码语言:javascript
复制
player.pause()
player.replaceCurrentItem(with: nil)

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

由于此错误,本机控件仍然可见,但不再工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-05-27 08:29:59

丢失锁定屏幕控件的一种快速方法是使您的音频会话可混合(而不禁用您的音频会话):

代码语言:javascript
复制
try! AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: .mixWithOthers)

当您想要将.mixWithOthers移除时,请删除它们。

另一种,也许更好的方法是,一旦暂停播放,就移除MPRemoteCommandCenter目标。如果你像这样设置它

代码语言:javascript
复制
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
    }
}

然后删除如下所示的目标:

代码语言:javascript
复制
func removeRemoteTargets() {
    let commandCenter = MPRemoteCommandCenter.shared()
    commandCenter.playCommand.removeTarget(playTarget)
    playTarget = nil
    commandCenter.pauseCommand.removeTarget(pauseTarget)
    pauseTarget = nil
}

附注:这些都是“似乎有效!”答案。我不知道您应该如何确定AVPlayer何时完成其音频I/O (除了通过setActive:false失败进行轮询)。我的理由是,成为锁定屏幕/“现在播放应用程序”有3部分(这在某种程度上被记录在某个地方,是我现在能找到的最接近它的东西,尽管在系统日志中最清楚地说明了它是如何工作的):

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

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

票数 3
EN

Stack Overflow用户

发布于 2019-07-29 11:51:22

AVPlayer不会立即停止,所以当它暂停时,您需要订阅它的状态更改来捕捉它。只有这样,您才能安全地禁用AVAudioSession

Swift 5例

代码语言:javascript
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2019-05-20 23:05:08

您得到该错误是因为在解除播放机之前,您正在停用音频会话:您可以使用:

代码语言:javascript
复制
play.pause()
player = nil

但是你应该先宣布你的球员是可选的。您的问题与:不可能阻止AVPlayer有关。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56132974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档