ios - 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。
解决方案
根据您显示的代码无法重现该问题。因此,听起来您在某处有额外的参考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
属性,如果您的代码无法编译,请注释掉引用它的所有内容,直到代码编译。测试应用程序;一切都很好。现在回过头来找出你没有告诉我们问题出在哪里的代码。
推荐阅读
- java - 调用 java WebServlet 时收到 Ajax 错误 404
- javascript - 我有一个计数器来跟踪数字或回合,但我不知道在达到该数字后如何结束游戏
- python - 来自桌面应用程序的 OAuth2 身份验证代码
- python - from google import google ImportError: cannot import name 'google' from 'google' (unknown location)
- unity3d - 连续旋转 90 度无法获得初始角度
- java - HashBiMap 被阻止
- bots - 用于创建团队频道的图形 API 更频繁地提供 429
- angular - 使用 npm 链接深入研究 Angular 包
- xcode - 我从 X-Code 中删除了 App.framework 和 flutter.framework。有什么帮助让他们回来吗?
- html - 替代显示:inline-flex