2016-09-15 61 views
1

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

在乐器中深入研究之后,我发现所有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; 
} 

我已验证每次新资产加载时都会调用此方法。 这是所有堆&匿名VM图,其中第一代在任何视频播放之前,第三代在离开视频播放器之后。在这之间,我迅速跳过了大约20个视频。

enter image description here

回答

1

这样做的原因是,我开始时,我装的资产与loadValuesAsynchronouslyForKeys装载值,但如果我这个方法完成之前就下资产感动,我从来没有取消它。存储AVURLAsset的属性,然后在适当的时候调用

[self.asset cancelLoading]; 

后,问题消失。