【问题标题】:How many AVPlayers are allowed to be created at the same time?允许同时创建多少个 AVPlayer?
【发布时间】:2017-03-21 08:17:36
【问题描述】:

我有一个collectionView,每个cell 都有一个设置为播放的AVPlayer。所以每个单元都在同时播放一个视频。似乎iOS只允许您同时播放16个视频。例如,看看我下面的示例应用程序。在 50 个cells 中,只有 16 个开始播放视频。这个数字始终保持不变。这发生在运行 iOS 10 的 iPhone 6s 上。然而,在 Xcode 模拟器中,所有 50 个视频都开始播放。此问题仅在实际设备上发生。

另外,当我打印出来时,我得到了这两个错误:

print("Video player Status Failed: player item error =  (self.player.currentItem.error)")
print("Video player Status Failed: player error = \(self.player.error)")

2016-11-07 15:53:46.548288 SampleApp[1810:515089] 视频播放器状态失败:播放器项目错误 = 错误域 = AVFoundationErrorDomain 代码 =-11839 “无法解码”用户信息 = {NSUnderlyingError = 0x1704414d0 {错误域 = NSOSStatusErrorDomain Code=-12913 "(null)"}, NSLocalizedFailureReason=此媒体所需的解码器正忙。, NSLocalizedRecoverySuggestion=停止任何其他解码媒体的操作并重试。, NSLocalizedDescription=无法解码} 2016-11-07 15:53:46.548358 SampleApp[1810:515089] 视频播放器状态失败:播放器错误 = (null)

你可以拥有多少个AVPlayer,或者我做错了什么?

谢谢!

【问题讨论】:

    标签: ios objective-c swift avfoundation avplayer


    【解决方案1】:

    确实,众所周知,您可以同时保持活动的 AVPlayer 实例的数量有一个上限,但这个限制取决于您的代码运行的平台。 我自己发现在运行 iOS 8 的 iPhone 5s 上,有 4 个并发 AVPlayer 实例的限制。 Here,例如,用户报告 tvOS 的限制为 7,与 2012 年报告的相同限制为 4 in stack overflow

    在任何情况下,这个限制没有被官方记录意味着它可以在平台和操作系统版本之间来回改变,所以你不应该在此基础上编写任何代码,而只是将并发 AVPlayer 实例保持在尽可能低的水平。

    【讨论】:

    • 很可能是硬件功能?
    • @i_am_jorf 好吧,他们没有记录它的事实使它很可能是任何东西的功能。
    • @pevasquez 对于我的应用,我将同时播放大约 10-20 个视频。有解决方法吗?有图书馆吗?或者有没有办法重用 AVPlayer?谢谢!
    • @pevasquez 似乎 prepareForReuse 的调用速度比委托方法 willDisplayCelldidDisplayCell 慢。如果我有一个 collectionView 始终在屏幕上显示大约 8 个视频,并且我滚动查看更多视频,它适用于 willDisplayCelldidDisplayCell。但是对于prepareForReuse,并不是所有的都可以玩,因为AVPlayer 没有设置为nil,因为它们离开了屏幕——它们似乎会在内存中停留一段时间。对此有何想法?
    • @Adrian_H 实现您所期待的最佳方式可能可以在这篇 Pinterest 工程博客文章中找到,了解他们如何构建自己的原生播放器,这是一个很好的阅读:medium.com/@Pinterest_Engineering/…
    【解决方案2】:

    并不是不能有多个 AVPLayer,而是不能有太多像player = AVPlayer(playerItem: playerItem) 那样与 AVPlayer 关联的 AVPlayerItems。

    例如,您可能推送了多个 vcs,并且在每个 vcs 中您都有一个使用 playerItem 初始化的播放器,最终您的应用会崩溃。

    您必须将 playerItem 与播放器 player?.replaceCurrentItem(with: nil) 分离以防止出现任何问题。

    崩溃前player/playerItems的数量取决于设备,但在iPhone 7+上,14-16绝对是限制,之后会发生崩溃。

    您可以在herehere 阅读更多相关信息

    【讨论】:

      猜你喜欢
      • 2023-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-02-05
      • 1970-01-01
      • 2011-04-22
      • 2011-05-16
      • 2018-03-30
      • 1970-01-01
      相关资源
      最近更新 更多