【问题标题】:Is there any difference between using AVPlayer, AVPlayerItem, and AVPlayerAsset?使用 AVPlayer、AVPlayerItem 和 AVPlayerAsset 有什么区别吗?
【发布时间】:2020-10-16 09:51:18
【问题描述】:
我找到了用 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)
以上这些有什么区别吗?
【问题讨论】:
标签:
ios
swift
avplayer
avasset
avplayeritem
【解决方案1】:
来自AVPlayer.init(url:)的文档
此方法隐式创建一个AVPlayerItem 对象。您可以使用currentItem获取播放器项目。
所以我们知道,当您使用第一种方式时,在后台会发生与第二种方式类似的事情 - 将使用您指定的 URL 创建一个 AVPlayerItem。所以第一种方式和第二种方式是一样的。
虽然文档没有明确说明这一点,但我很确定 AVPlayerItem.init(url:) 也会使用您指定的 URL 创建一个 AVAsset,因为 AVPlayerItem 是:
一个对象,用于对玩家播放的资产的时间和呈现状态进行建模。
措辞表明,如果没有AVAsset,就不能拥有AVPlayerItem。事实上,AVPlayerItem.asset 是一个非可选属性。所以你真的需要一个AVAsset 来创建一个AVPlayerItem。再加上 AVPlayerItem.init(url:) 是一个便利的初始化程序,init(asset:automaticallyLoadedAssetKeys:) 是指定的初始化程序,我很确定 AVPlayerItem.init(url:) 也会在后台创建一个 AVAsset。
如果你想知道为什么 AVPlayer.init(playerItem:) 和 AVPlayerItem.init(asset:) 存在,而这三种方式无论如何都做同样的事情,它们适用于当你碰巧使用 AVPlayerItems 时,你想创建一个 @987654343 @,当你恰好在使用AVAssets 时,你想创建一个AVPlayerItem。