#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. Боюсь, я не знаю. Если только он не ждет, пока существующий буфер освободится, чтобы начать вводить новый контент. Но это всего лишь дикое предположение.