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。

xiaoweiba2000 回答:iOS:在锁定屏幕上使用控件时,AVPlayer会播放多个音频实例

根据显示的代码无法重现该问题。因此,听起来好像您在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属性,如果代码无法编译,则注释掉引用它的所有内容,直到代码编译为止。测试应用程序;一切都很好。现在返回并找出您的代码中没有告诉我们的问题出处。

本文链接:https://www.f2er.com/3157474.html

大家都在问