iOS: AVPlayer 在锁定屏幕上使用控件时播放多个音频实例
iOS: AVPlayer plays multiple instances of audio when using controls on lock screen
我已经设置了一个函数来创建 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()
})
}
播放器在前台工作正常。如果我转到锁定屏幕,音频会继续播放。如果我在锁定屏幕中按下暂停按钮,音频将暂停。问题是,如果我随后在锁定屏幕上单击播放,我正在收听的音频将恢复,但音频的第二个实例从头开始播放,所以现在我有两个音频实例同时播放。如果我再次暂停并再次按下播放,另一个音频实例将开始播放。
如何解决这个问题,使锁屏按钮只影响原始音频?
我正在研究 Xcode 11,Swift 4.2。
根据您显示的代码无法重现该问题。因此,听起来您在某处对 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
属性 并且,如果您的代码编译失败,请注释掉所有引用它的内容,直到代码编译成功。测试应用程序;一切都很好。现在回过头来找出代码中您没有向我们展示问题出在哪里。
我已经设置了一个函数来创建 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()
})
}
播放器在前台工作正常。如果我转到锁定屏幕,音频会继续播放。如果我在锁定屏幕中按下暂停按钮,音频将暂停。问题是,如果我随后在锁定屏幕上单击播放,我正在收听的音频将恢复,但音频的第二个实例从头开始播放,所以现在我有两个音频实例同时播放。如果我再次暂停并再次按下播放,另一个音频实例将开始播放。
如何解决这个问题,使锁屏按钮只影响原始音频?
我正在研究 Xcode 11,Swift 4.2。
根据您显示的代码无法重现该问题。因此,听起来您在某处对 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
属性 并且,如果您的代码编译失败,请注释掉所有引用它的内容,直到代码编译成功。测试应用程序;一切都很好。现在回过头来找出代码中您没有向我们展示问题出在哪里。