在iOS中控制app外的音频

hhh*_*hhh 1 audio avfoundation ios swift

我正试图从应用程序外部控制我的音频播放器,我开始了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)
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的主要目标是控制播放和暂停,如下所示: 在此输入图像描述

Pie*_*sso 9

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

  • 在目标>功能中为音频,AirPlay和画中画启用背景模式.
  • 如果您要从网络流式传输音频,请启用背景提取的背景模式.

音频的背景模式

  • 导入AVKit和MediaPlayer依赖.

设置你AVPlayer的AVPlayerItem:

guard let url = URL(string: "http://your.website.com/playlist.m3u8") else {
    return
}
player = AVPlayer(url: url)
Run Code Online (Sandbox Code Playgroud)

设置你的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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

设置InfoCenter和RemoteCommandCenter:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果您需要在MPNowPlayingInfoCenter此处放置更多信息,请列出所有可用属性:常规媒体项属性键| Apple开发人员文档