【发布时间】:2021-05-22 17:01:54
【问题描述】:
我在构建视频预加载时遇到了一个问题,方法是创建(持久)AVPlayerItems 并提前将它们分配给(新/临时)AVPlayers。
我看到的第一个问题是,之前分配给AVPlayer 的AVPlayerItem 如果分配给新的AVPlayer 会抛出异常。后来我把它缩小到原来的 AVPlayer 没有被释放,这就是为什么 AVPlayerItem 不能与不同的播放器一起工作“一个 AVPlayerItem 不能与多个 AVPlayer 的实例相关联”。
这是最小的可重现示例:
// AVAsset can be preloaded using `asset.loadValuesAsynchronously`.
let originalAsset = AVAsset(url: URL(string: "https://www.whatever.com")!)
// AVPlayerItem is persisted across multiple AVPlayer instances.
let playerItem = AVPlayerItem(asset: originalAsset)
// Initial preload.
var player: AVPlayer? = AVPlayer(playerItem: playerItem)
player?.replaceCurrentItem(with: nil) // Doesn't help.
player = nil // Doesn't actually deinit.
// Later at some point...
player = AVPlayer(playerItem: playerItem) // Crash here.
【问题讨论】:
标签: ios swift memory-leaks avfoundation avplayer