首页 文章

AVPlayers随时间缓慢缓冲

提问于
浏览
1

我正在开发一个支持视频播放的应用程序,类似于Snapchat正在做的事情(你可以点击一堆远程视频) . 在点击一些视频后,缓冲似乎变得更慢,并且在你继续前进的某个时刻完全停止 . 听起来很像我的内存泄漏 .

在仪器中深入研究后,我发现所有AVPlayers,AVPlayerItems和AVPlayerLayers都被正确释放 . 我发现的唯一泄漏是这些:

enter image description here

但是,通过研究连接图和内存使用情况,我可以清楚地看到即使在关闭视频播放器并坐在应用程序的摄像头视图中之后,仍然会发生一些缓冲 . 网络活动保持相当高,内存缓慢增长 .

为了更好地理解我如何进行视频播放,这里有一个简短的解释 . 我有一个VideoPlayer对象,我只发起一个,然后我给它新的资产 . 在给它一个新的资产之前,我打电话给 stopBuffering ,只是为了确保没有留下任何东西(我们都看到它是多么成功) .

- (void)stopBuffering
{
    [self removeObservers];
    [self.player pause];
    [self.avPlayer replaceCurrentItemWithPlayerItem:nil];
    self.avPlayer = nil;
    self.player = nil;
    self.playerItem = nil;
}

我已经验证每次加载新资产时都会调用此方法 . 这是All Heap&Anonymous VM图,其中第一代是在任何视频播放之前,第三代是在离开视频播放器之后 . 在此期间,我迅速浏览了大约20个视频 .

enter image description here

1 回答

  • 1

    这样做的原因是,每当我加载资产时,我就开始使用 loadValuesAsynchronouslyForKeys 加载值,但如果我在此方法完成之前移动了下一个资产,我从未取消它 . 将 AVURLAsset 存储为属性然后调用

    [self.asset cancelLoading];
    

    在适当的时候,问题消失了 .

相关问题