一个UIScrollView中有多个AVPlayer - 只显示其中的16个

5
我正在开发一个视频库,我有一个ScrollView,在它里面有多个视图,每个视图都有一个单独的AVPlayer - 到目前为止,我想这是相当标准的。请注意,所有AVPlayers都已预加载其视频,等待播放。
问题出现在我在库中有许多项(视频)时。任何时候 - 只有16个项目从头到尾显示,其余则显示黑屏。如果我反转项目的顺序 - 新侧的另外16个将被显示,其余的也会显示黑屏。
此外,如果我进入另一个屏幕,然后返回到库 - 一切变黑,什么都不显示。
如果我用随机颜色背景替换播放器 - 所有视图都会显示。所以我认为问题出在播放器上,而不是视图本身。
根据Xcode,我的应用程序只使用了约7-10%的CPU和约10-11 MB的RAM,因此它看起来不像是性能问题 - 更像是同时活动的AVPlayers的限制,但我找不到任何相关信息。
有人有什么建议吗?这让我很疯狂。
提前感谢!

我也遇到了同样的限制。你找到解决方案了吗? - bsarrazin
同样的限制... 有什么想法吗?@bensarz - Shai Mishali
我也遇到了这个错误。 - Robert
1个回答

1
我在不同的情况下遇到了与你相同的问题(我有一个加载视频的表格视图,在16次点击后停止工作)。
以下是帮助我的一些线程: AVPlayer多次播放后崩溃- AVPlayerItem失败,出现AVStatusFailed和错误代码“无法解码” 如何关闭之前的AVPlayer和AVPlayerItem 无法停止AVPlayer
基本上,最多可以创建16个AVPlayer/AVPlayerLayers。如果您尝试超过此限制,将会出现奇怪的行为。
在您的特定情况下,您需要创建一个缓冲区来存储16个视频,并在它们在滚动视图上不再可见时将其删除/添加。我建议将缓冲区设置得更低(例如8),因为16会导致最新的iPhone型号严重延迟。
要删除播放器,请使用以下代码:
player.pause()
player = nil
playerLayer.removeFromSuperlayer()

确保播放器是一个变量(不要使用let),并且它是一个可选类型。

var player : AVPlayer?  = AVPlayer(url: videoURL as URL)

希望这有所帮助。

1
这个答案是不正确的。如果你阅读了你发布的第二个链接,它说:“这不是关于AVPlayer或AVPlayerItem实例数量的限制,而是AVPlayerItem与AVPlayer的关联会创建一个“渲染管道”。”我已经进行了彻底的测试。你可以拥有100个播放器和播放器图层,16个限制问题出现在avplayer初始化时使用了playerItem。所以答案实际上是“有16个avPlayers初始化为16个playerItems的限制”。这个限制也基于你的设备。旧设备可能有12个限制。再次强调,我已经进行了彻底的测试。 - Lance Samaria

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接