如何断开 AVPlayer 与 AVPlayerItem 的连接?

How to disconnect AVPlayer from AVPlayerItem?

我想重复使用 AVPlayerItem,但一直收到此错误:

An AVPlayerItem cannot be associated with more than one instance of AVPlayer

在尝试重新使用它之前,我像这样销毁了以前的 AVPlayer:

[self.player pause];
[self.player replaceCurrentItemWithPlayerItem:nil];
self.player = nil;

为什么 AVPlayerItem 仍然关联,如何断开关联?

这是一个完整再现问题的要点(顺便说一句,只有 50 行):https://gist.github.com/sbiermanlytle/14a6faab515f7691b810789086ae9e50

您可以 运行 通过创建一个新的单一视图应用程序,并用该代码替换 ViewController 实现。

您无法断开 AVPlayerItems。我猜指向播放器的私有 属性 并不弱,因此通过将当前播放器项目设置为 NULL 来取消引用该项目不会自动将项目的播放器 属性 设置为 NULL..

只需创建一个新的。使用 URL,在这种情况下,缓存系统将立即 return 一个 AVAsset(只是另一个猜测...),或者,更好的是,使用您想要的 PlayerItem 资产 'disconnect'.

AVPlayerItem* newPlayerItem = [AVPlayerItem playerItemWithAsset:playerItem.asset];

这样做没有性能损失。该项目只是资产的 'handle',其中包含真实的数据。所以不要害怕丢弃垃圾并即时创建新项目。