iOS: AVPlayer воспроизводит несколько экземпляров звука при использовании элементов управления на экране блокировки - PullRequest
0 голосов
/ 05 ноября 2019

Я настроил функцию, которая создает экземпляр 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()

    })
}

Плеер отлично работает на переднем плане. Если я иду на экран блокировки, звук продолжает играть. Если я нажму кнопку «Пауза» на экране блокировки, звук будет приостановлен. Проблема заключается в том, что если я затем нажимаю кнопку воспроизведения на экране блокировки, возобновляемое прослушивание звука возобновляется, но второй экземпляр звука начинает воспроизводиться с самого начала, поэтому теперь у меня одновременно воспроизводятся 2 экземпляра звука. Если я снова сделаю паузу и снова нажму кнопку воспроизведения, начнет воспроизводиться еще один экземпляр звука.

Как это исправить, чтобы кнопки на экране блокировки влияли только на исходное аудио?

Я работаюна Xcode 11, с Swift 4.2.

1 Ответ

0 голосов
/ 05 ноября 2019

Проблема не может быть воспроизведена на основе кода, который вы показали. Поэтому, похоже, у вас есть дополнительная ссылка где-то на 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 свойство и, если ваш код не скомпилируется, закомментируйте все, что к нему относится, пока код не скомпилируется. Протестировать приложение;все хорошо. Теперь вернитесь назад и выясните, где в коде, который вы не показали нам , откуда возникла проблема.

...