我正在制作支持视频播放的应用,类似于Snapchat正在做的事情(您可以点击一堆远程视频)。在点击一些视频后,缓冲似乎变得更慢,并且在你继续前进的某个时刻完全停止。听起来很像是对我的记忆泄漏。
在仪器中深入研究后,我发现所有AVPlayers,AVPlayerItems和AVPlayerLayers都被正确释放。我发现的唯一泄漏是:
然而,通过研究连接图和内存使用情况,我可以清楚地看到即使在解除视频播放器并坐在应用程序的摄像头视图中之后,仍然会发生一些缓冲。网络活动保持相当高,内存缓慢增长。
为了更好地了解我如何进行视频播放,这里有一个简短的解释。我有一个VideoPlayer对象,我只发起一个,然后我给它新的资产。在给它一个新资产之前,我打电话给stopBuffering
,只是为了确保没有留下任何东西(我们都看到它有多成功)。
- (void)stopBuffering
{
[self removeObservers];
[self.player pause];
[self.avPlayer replaceCurrentItemWithPlayerItem:nil];
self.avPlayer = nil;
self.player = nil;
self.playerItem = nil;
}
我已经验证每次加载新资产时都会调用此方法。 这是All Heap&匿名VM图,其中第一代在任何视频播放之前,第三代在离开视频播放器之后。在此期间,我很快跳过了大约20个视频。
答案 0 :(得分:1)
这样做的原因是,每当我加载资产时,我就开始使用loadValuesAsynchronouslyForKeys
加载值,但如果我在此方法完成之前移动了下一个资产,我从未取消它。将AVURLAsset
存储为属性然后调用
[self.asset cancelLoading];
在适当的时候,问题就消失了。