首页 > 解决方案 > iOS:在锁定屏幕上使用控件时,AVPlayer 会播放多个音频实例

问题描述

我已经设置了一个创建 AVPlayerViewController 实例的函数,以便播放音轨(存储在我们的服务器中)。

func playAudio(_ url: URL) {
    let avAssest = AVAsset(url: url)
    let playerItem = AVPlayerItem(asset: avAssest)

    audioPlayer = AVPlayer(playerItem: playerItem)

    let playerViewController = AVPlayerViewController()
    playerViewController.player = audioPlayer

    try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

    self.present(playerViewController, animated: true, completion: {
        self.audioPlayer.play()

    })
}

播放器在前台运行良好。如果我进入锁定屏幕,音频会继续播放。如果我在锁定屏幕中按下暂停按钮,音频会暂停。问题是,如果我然后单击锁定屏幕上的播放,我正在听的音频会继续播放,但是第二个音频实例从头开始播放,所以现在我有两个音频实例同时播放。如果我再次暂停并再次按播放,则音频的另一个实例开始播放。

如何解决此问题,以使锁屏按钮仅影响原始音频?

我正在使用 Swift 4.2 开发 Xcode 11。

标签: iosswiftavplayeravplayerviewcontroller

解决方案


根据您显示的代码无法重现该问题。因此,听起来您在某处有额外的参考self.audioPlayer,而问题是由您没有向我们透露的代码引起的。

为了检验这个理论,让我们从不让它成为一个全球性的开始。在问题的范围内没有必要这样做。

修改您的代码,使其看起来像这样(注意将其设为本地的更改):

    let avAssest = AVAsset(url: url)
    let playerItem = AVPlayerItem(asset: avAssest)

    let audioPlayer = AVPlayer(playerItem: playerItem) // *

    let playerViewController = AVPlayerViewController()
    playerViewController.player = audioPlayer

    try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

    self.present(playerViewController, animated: true, completion: {
        audioPlayer.play()  // *

    })

现在删除该audioPlayer属性,如果您的代码无法编译,请注释掉引用它的所有内容,直到代码编译。测试应用程序;一切都很好。现在回过头来找出你没有告诉我们问题出在哪里的代码。


推荐阅读