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

Posted

技术标签:

【中文标题】使用 AVPlayer、AVPlayerItem 和 AVPlayerAsset 有啥区别吗?【英文标题】: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)

以上这些有什么区别吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于使用 AVPlayer、AVPlayerItem 和 AVPlayerAsset 有啥区别吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AVURLAsset + AVPlayerItem + AVPLayer 流式传输 .mp3

如何正确删除/释放 AVPlayer/AVPlayerItem?

设置 AVPlayer AVPlayerItem 缓冲区大小?

通过 AvPlayerItem 和 AvPlayer 流式传输时监控下载的字节数 - iOS

iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确

iOS 8.4 AVFoundation _attachToPlayer 或 _attachToFigPlayer 崩溃 |一个 AVPlayerItem 不能与多个 AVPlayer 实例关联