Почему replaceCurrentItem так медленно работает на AVPlayer?

#ios #swift #avplayer #audio-streaming #avplayeritem

Вопрос:

Я разрабатываю музыкальное приложение, и мне нужно часто переключаться между потоковыми URL-адресами. Моя текущая реализация включает в себя an AVPlayer и a PlayerItem , которые определены как глобальные переменные в моем менеджере:

 public var player: AVPlayer? public var playerItem: AVPlayerItem?  

Каждый раз, когда пользователь нажимает на контент, я меняю элемент проигрывателя и воспроизводю новый:

 public func changePlayerItem(withUrl url: URL) {  playerItem = AVPlayerItem(url: url)  player?.replaceCurrentItem(with: playerItem)  ...  

Однако выполнение replaceCurrentItem функции создает заметную задержку в пару секунд. Эта задержка будет сведена к нулю, если вместо этого я сделаю следующее:

 public func changePlayerItem(withUrl url: URL) {  player = AVPlayer(url: url)  ...  

Если я вместо этого определю playerItem как локальную переменную:

 public func changePlayerItem(withUrl url: URL) {  let playerItem = AVPlayerItem(url: url)  player?.replaceCurrentItem(with: playerItem)  ...  

Кажется, в этом случае задержки нет, но я не слышу звука.

macOS Big Sur 11.6, Xcode 13.1. Цель развертывания-iOS 13.0, и я тестирую iPhone 7plus с iOS 15.0.2.

Почему это происходит? Есть ли за этим какая-то причина?

Комментарии:

1. Я не очень хорошо разбираюсь в AVPlayer, но я пользовался Интернетом еще до того, как он стал называться Интернетом… Может ли это быть буферизация потока во время задержки?

2. @ScottThompson Я имею в виду, да, это может быть, но почему, если я снова создам AVPlayer, вместо этого эта задержка не произойдет?

3. Боюсь, я не знаю. Если только он не ждет, пока существующий буфер освободится, чтобы начать вводить новый контент. Но это всего лишь дикое предположение.