Есть ли какая-либо разница между использованием AVPlayer, AVPlayerItem и AVPlayerAsset?

#ios #swift #avplayer #avasset #avplayeritem

#iOS #swift #avplayer #avasset #avplayeritem

Вопрос:

Я нашел три способа воспроизведения видео с URL.

 let url = "some url"

// first way
AVPlayer(url: url)

// second way
let playerItem = AVPlayerItem(url: url)
AVPlayer(playerItem: playerItem)

// third way
let asset = AVAsset(url: url)
let playerItem = AVPlayerItem(asset: asset)
AVPlayer(playerItem: playerItem)
  

Есть ли какая-либо разница между ними?

Ответ №1:

Из документов AVPlayer.init(url:)

Этот метод неявно создает AVPlayerItem объект. Вы можете получить элемент player с помощью currentItem .

Итак, мы знаем, что при использовании первого способа происходит нечто похожее на второй способ — AVPlayerItem будет создан URL-адрес, указанный вами. Следовательно, первый и второй способ одинаковы.

Хотя в документах это явно не указано, я уверен AVPlayerItem.init(url:) , что создает AVAsset использование URL, который вы также указали, поскольку an AVPlayerItem :

Объект, используемый для моделирования времени и состояния представления ресурса, воспроизводимого игроком.

Формулировка предполагает, что вы не можете иметь a AVPlayerItem без a AVAsset . Действительно, AVPlayerItem.asset это необязательное свойство. Итак, вам действительно нужно AVAsset создать an AVPlayerItem . Это, в сочетании с тем фактом, что AVPlayerItem.init(url:) это удобный инициализатор, и init(asset:automaticallyLoadedAssetKeys:) я совершенно уверен AVPlayerItem.init(url:) , что он также создает AVAsset under the hood .

Если вам интересно, почему AVPlayer.init(playerItem:) и AVPlayerItem.init(asset:) существуют, когда все три способа в любом случае делают одно и то же, они предназначены для случаев, когда вы просто так работаете с AVPlayerItem s, когда хотите создать a AVPlayer , и когда вы просто так работаете с AVAsset s, когда хотите создать an AVPlayerItem .