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

use*_*004 9 ios avplayer avasset swift 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)
Run Code Online (Sandbox Code Playgroud)

以上这些有什么区别吗?

Swe*_*per 7

从文档AVPlayer.init(url:)

该方法隐式创建一个AVPlayerItem对象。您可以使用 获取播放器项目currentItem

因此我们知道,当您使用第一种方式时,会在幕后发生与第二种方式类似的情况 -AVPlayerItem将使用您指定的 URL 创建一个。因此,第一种方式和第二种方式是相同的。

尽管文档没有明确说明这一点,但我很确定也会使用您指定的 URLAVPlayerItem.init(url:)创建一个,因为 an是:AVAssetAVPlayerItem

用于对玩家播放的资产的计时和呈现状态进行建模的对象。

该措辞表明,如果没有 a 就不能有AVPlayerItema AVAsset。事实上,AVPlayerItem.asset是一个非可选属性。所以你确实需要一个AVAsset来创建一个AVPlayerItem. 再加上它AVPlayerItem.init(url:)是一个方便的初始化器,并且init(asset:automaticallyLoadedAssetKeys:)是指定的初始化器,我确信它也会在引擎盖下AVPlayerItem.init(url:)创建一个。AVAsset

如果您想知道为什么AVPlayer.init(playerItem:)AVPlayerItem.init(asset:)存在,当所有三种方式都做同样的事情时,它们适用于当您想要AVPlayerItem创建 时恰好使用 s 时AVPlayer,以及当您恰好使用AVAssets 时当您想要创建一个AVPlayerItem.