【问题标题】:Is there a way to show lock screen controls using AVAudioEngine and AVAudioPlayerNode?有没有办法使用 AVAudioEngine 和 AVAudioPlayerNode 显示锁屏控件?
【发布时间】:2018-09-30 05:29:00
【问题描述】:

我正在我的应用程序中使用 AVAudioEngine 和 AVAudioPlayerNode 处理音频播放,并且我想实现远程控制。背景音频已配置并正在运行。

控制中心控件正常工作,但是当我从应用程序内部播放/暂停音乐时,播放/暂停按钮没有更新。 我正在真实设备上进行测试。

Control center screenshot

这是我的 AVAudioSession 设置代码:

func setupAudioSession() {

    UIApplication.shared.beginReceivingRemoteControlEvents()

    do {
        try AVAudioSession.sharedInstance().setActive(true)
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    } catch let sessionError {
        print("Failed to activate session:", sessionError)
    }
}

MPRemoteCommandCenter 设置:

func setupRemoteControl() {

    let commandCenter = MPRemoteCommandCenter.shared()

    commandCenter.playCommand.isEnabled = true
    commandCenter.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
        self.audioPlayerNode.play()
        return .success
    }

    commandCenter.pauseCommand.isEnabled = true
    commandCenter.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
        self.audioPlayerNode.pause()
        return .success
    }
}

锁屏控件 - 从未出现。

【问题讨论】:

  • @matt 编辑了问题
  • @matt 是的,一切都在后台播放得很好。背景模式已配置。也许我缺少一些 AVAudioEngine 特殊设置?
  • @matt 当然,我可以从控制中心播放/暂停音频。但是,如果我进入我的应用程序并暂停音频调用 AVaudioPlayerNode.pause() 例如,控制中心中的播放按钮图标不会从“暂停图标”更新为“播放图标”,同样的事情发生在反向

标签: ios swift avaudiosession avaudioengine mpremotecommandcenter


【解决方案1】:

所以这是我的问题的解决方案,我正在启动我的 AVAudioEngine 及其从 viewDidLoad() 调用的设置函数,这就是问题所在,我在我的 AVAudioPlayerNode 上使用了 .play()/.pause() 方法来操作音频,但是 AVAudioPlayerNode 不会发出主音频,AVAudioEngine 的 outputNode 会。

因此,当您想从应用程序内部或命令中心播放/暂停音频时,如果您正在使用 AVAudioEngine 处理应用程序中的音频,请不要忘记调用 AVAudioEngine 上的 .stop()/.start() 方法.即使没有将单个属性设置为MPNowPlayingInfoCenter.default().nowPlayingInfo,锁屏控件也应显示,并且播放/暂停按钮应在命令中心/锁屏中正确更新。

MPRemoteCommandCenter 设置:

func setupRemoteControl() {

    let commandCenter = MPRemoteCommandCenter.shared()

    commandCenter.playCommand.isEnabled = true
    commandCenter.playCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
        try? self.audioEngine.start()
        return .success
    }

    commandCenter.pauseCommand.isEnabled = true
    commandCenter.pauseCommand.addTarget { (_) -> MPRemoteCommandHandlerStatus in
        self.audioEngine.stop()
        return .success
    }
}

【讨论】:

  • 请注意,如果您将多次访问播放/暂停命令,最好使用 AVAudioEngine 的 pause() 方法而不是 stop()。
  • 谢谢!!!多年来一直试图弄清楚这一点。我刚刚暂停了单个音符,而不是整个引擎。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2011-06-24
相关资源
最近更新 更多