问题描述
我发现了使用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)
以上两者之间有区别吗?
解决方法
的文档
此方法隐式创建一个
AVPlayerItem
对象。您可以使用currentItem
获取播放器项目。
因此我们知道,当您使用第一种方式时,与第二种方式相似的事情正在发生-将会使用您指定的URL创建一个AVPlayerItem
。因此,第一和第二种方法是相同的。
尽管文档没有明确说明,但我很确定AVPlayerItem.init(url:)
也会使用您指定的URL创建AVAsset
,因为AVPlayerItem
是:
用于模拟玩家播放的 资产 的时间和呈现状态的对象。
该措辞表明,没有AVPlayerItem
,就不会有AVAsset
。实际上,AVPlayerItem.asset
是一个非可选属性。因此,您确实需要AVAsset
来创建AVPlayerItem
。结合AVPlayerItem.init(url:)
是便捷初始化程序和init(asset:automaticallyLoadedAssetKeys:)
被指定为事实的事实,我很确定AVPlayerItem.init(url:)
也会在后台创建一个AVAsset
。
如果您想知道当三种方式都执行相同操作时为什么AVPlayer.init(playerItem:)
和AVPlayerItem.init(asset:)
存在,那是因为当您恰好在您使用AVPlayerItem
时想创建一个AVPlayer
,而当您恰好要创建一个AVAsset
时正在使用AVPlayerItem
时。