微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AVPlayers过多,导致由于内存问题而终止

如何解决AVPlayers过多,导致由于内存问题而终止

我有一个内有AVPlayer的vc。通过该vc,我可以在其中具有其他播放器的情况下推入另一个vc,并且可以在其中具有播放器的情况下继续推更多的vc。大约 14th 个VC被推入应用程序后,Terminated due to memory issue崩溃了。

当我查看内存图(左窗格中的第9个图标)时,内存图大约为 70mb ,因此内存中没有令人讨厌的跳跃。我所有的视频文件都保存到磁盘并从磁盘中检索,每当我弹出vc时,Deinit内都会有一条始终运行的打印语句,因此没有其他原因引起内存问题。这使我相信其他SO答案表明,同时 16 AVPlayers是有限制的。我认为所有这些播放器都导致内存崩溃的原因是,一旦我注释掉了播放器初始化代码,我就可以在 30 个vcs上进行推送而不会崩溃。

我正要从viewWilldisappear/viewDiddisappear中的父vc中完全删除播放器,playerItem,它的观察者和播放器层,然后一旦弹出子项,再次在viewWillAppear/viewDidAppear中重新初始化所有内容,但是后来我来了在this blog上说

共享视频“渲染管道”数量的平台限制 设备上的应用之间。原来,将AVPlayer设置为 nil不会释放播放管道,实际上它是 playerItem与在其中创建管道的播放器的关联 第一名

answer

这不是对AVPlayer实例数量的限制,或者 AVPlayerItem。而是AVPlayerItem与 AVPlayer创建一个“渲染管道”

问题是,当在新的vc上推动/弹出时(它将在其中包含播放器),我是否需要完全删除/读取与播放器相关的所有内容,还是将AVPlayerItem设置为{{1 }},然后重新初始化即可解决问题?

如果渲染管道引起了问题,则似乎限制不是在播放器上,而是在playerItems上。

代码

nil

解决方法

我刚刚对其进行了测试,并将其设置为nil并重新初始化,这使我可以在每个vc中插入一个AVPlayer的30个vc,而不会发生任何崩溃。

player?.replaceCurrentItem(with: nil)

所以问题不是AVPlayers的总数,而是this guy saidthe association of AVPlayerItem with an AVPlayer which creates a "render pipeline,而导致它们同时出现的原因太多。

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // !isMovingToParent only runs when popping back,*** I haven't tested it with presentation/dismissal ***
    if !isMovingToParent {

        if let playerItem = playerItem {
            self.player?.replaceCurrentItem(with: playerItem)
        }
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    
    self.player?.replaceCurrentItem(with: nil)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。