在iOS中控制app外的音频

时间:2017-11-01 16:07:35

标签: ios swift audio avfoundation

我试图从应用程序外部控制我的音频播放器, 我开始了一个av音频会话,但它没有在后台播放(在swift 3上运行正常),

        do{


        myPlayer =  AVPlayer(url: url!)

        let audioSession = AVAudioSession.sharedInstance()
        do {
            try audioSession.setCategory(AVAudioSessionCategoryPlayback
            )
            do {
                try audioSession.setActive(true)

            }

        }
        catch {
            print(error)
        }
    }

我的主要目标是控制播放和暂停,如下所示: enter image description here

1 个答案:

答案 0 :(得分:8)

因此,您正在构建一个使用AVPlayer在后​​台播放音频的应用。您应该使用MPNowPlayingInfoCenter在锁定屏幕和控制中心上显示歌曲的元数据,并使用MPRemoteCommandCenter来控制锁定屏幕和控制中心上的上一个/下一个/播放/暂停操作。

  • 音频,AirPlay和Picture in启用背景模式 目标>中的图片功能即可。
  • 如果您要从网络流式传输音频,请为后台提取启用背景模式。

Background Mode for Audio

  • 导入AVKitMediaPlayer依赖项。

使用AVPlayer

设置AVPlayerItem
guard let url = URL(string: "http://your.website.com/playlist.m3u8") else {
    return
}
player = AVPlayer(url: url)

设置AVAudioSession

private func setupAVAudioSession() {
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
        try AVAudioSession.sharedInstance().setActive(true)
        debugPrint("AVAudioSession is Active and Category Playback is set")
        UIApplication.shared.beginReceivingRemoteControlEvents()
        setupCommandCenter()
    } catch {
        debugPrint("Error: \(error)")
    }
}

设置InfoCenterRemoteCommandCenter

private func setupCommandCenter() {
    MPNowPlayingInfoCenter.default().nowPlayingInfo = [MPMediaItemPropertyTitle: "Your App Name"]

    let commandCenter = MPRemoteCommandCenter.shared()
    commandCenter.playCommand.isEnabled = true
    commandCenter.pauseCommand.isEnabled = true
    commandCenter.playCommand.addTarget { [weak self] (event) -> MPRemoteCommandHandlerStatus in
        self?.player.play()
        return .success
    }
    commandCenter.pauseCommand.addTarget { [weak self] (event) -> MPRemoteCommandHandlerStatus in
        self?.player.pause()
        return .success
    }
}

您可以将setupAVAudioSession()方法放在viewDidLoad()方法中,也可以放在您需要的任何其他位置。

如果您需要在MPNowPlayingInfoCenter这里放置更多信息,请列出所有可用属性:General Media Item Property Keys | Apple Developer Documentation