使用 AVPlayer、AVPlayerItem 和 AVPlayerAsset 有什么区别吗?

Is there any difference between using AVPlayer, AVPlayerItem, and AVPlayerAsset?

我找到了播放视频的三种方法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)

以上这些有区别吗?

来自 AVPlayer.init(url:)

的文档

This method implicitly creates an AVPlayerItem object. You can get the player item using currentItem.

所以我们知道,当您使用第一种方式时,幕后会发生类似于第二种方式的事情 - 将使用您指定的 URL 创建一个 AVPlayerItem。所以,第一种和第二种方式是一样的。

虽然文档没有明确说明这一点,但我很确定 AVPlayerItem.init(url:) 也使用您指定的 URL 创建了一个 AVAsset,因为 AVPlayerItem是:

An object used to model the timing and presentation state of an asset played by the player.

措辞表明没有 AVAsset 就不可能有 AVPlayerItem。事实上,AVPlayerItem.asset 是一个 non-optional 属性。所以你真的需要一个 AVAsset 来创建一个 AVPlayerItem。结合 AVPlayerItem.init(url:) 是一个方便的初始化器,而 init(asset:automaticallyLoadedAssetKeys:) 是指定的初始化器这一事实,我很确定 AVPlayerItem.init(url:) 也在幕后创建了一个 AVAsset

如果你想知道为什么 AVPlayer.init(playerItem:)AVPlayerItem.init(asset:) 存在,而这三种方式无论如何都做同样的事情,它们是为你恰好使用 AVPlayerItems 工作的当你想创建一个 AVPlayer 时,当你恰好在使用 AVAsset 时,当你想创建一个 AVPlayerItem.