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

标签 ios swift avplayer avplayerviewcontroller

我已经设置了一个函数来创建 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 属性,如果您的代码无法编译,请注释掉引用它的所有内容,直到代码编译为止。测试应用程序;一切都很好。现在返回并找出问题出在代码中没有向我们展示的位置。

关于iOS:在锁定屏幕上使用控件时,AVPlayer 会播放多个音频实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716854/

相关文章:

ios - AVQueuePlayer 无法播放本地 MP3 文件

ios - iOS 13 的 iOS 多任务 View 中的错误应用程序图标

iphone - Redis 对比iOS 应用程序中推送通知的 Web 服务

swift - 如何在 Swift 中创建通用枚举的实例

ios - 我的 AVPlayer 不应该从最后一点恢复到 LIVE Streaming

ios - AVPlayer 状态 AVPlayerStatusFailed 无法正常工作

ios - 有没有办法使用 XCTest 对 Touch Id 进行单元测试?

ios - UINavigationController 在 iOS7 上无法像在 iOS6.1 上一样同时工作

swift - 用于 Facebook 登录的自定义 UIButton

swift - 如何在 Swift 的 macOS 中禁用弹出按钮的 menuItem?