2016-05-30 111 views
0

首先,感谢您的帮助。iOS AVPlayer播放大量视频并导致内存过高

的问题:

1.I需要测试大量videos.I写了两个方法来测试视频。

2.当播放视频状态发生变化时,我设置avPlayer = nil和avPlayerItem = nil,我也添加@autoreleasepool {},但内存缓慢增加,我使用了这些工具,但没有找到内存泄漏,我发现很多问题并没有找到解决方案。

3.Here是我的代码:

-(void)CheckVideoURlCanPlay{ 
@autoreleasepool { 
    VideoPlayDataObj *videoPlay = [self.needCheckArr objectAtIndex:0]; 
    NSString *str = videoPlay.videoURL; 
    NSURL *url = [NSURL URLWithString:str]; 
    self.playItem = [AVPlayerItem playerItemWithURL:url]; 
    self.player = [AVPlayer playerWithPlayerItem:self.playItem]; 
    self.playLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; 
    self.playLayer.videoGravity = AVLayerVideoGravityResizeAspect; 
    self.playLayer.frame=CGRectMake(100, 80, 100, 100); 
    [self.view.layer addSublayer:self.playLayer]; 
    [self.player play]; 
    [self.playItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil]; 
    }} 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context{ 
@autoreleasepool { 

    if ([keyPath isEqualToString:@"status"]) { 
     if (self.player.currentItem.status == AVPlayerItemStatusReadyToPlay) { 
      @autoreleasepool { 

       [self.player.currentItem.asset cancelLoading]; 
       [self.player.currentItem cancelPendingSeeks]; 
       [self.player cancelPendingPrerolls]; 
       [self.playItem removeObserver:self forKeyPath:@"status"]; 
       self.playItem = nil; 
       self.player = nil; 

      } 
      [self.needCheckArr removeObjectAtIndex:0]; 
      [NSThread sleepForTimeInterval:5]; 
      [self CheckVideoURlCanPlay]; 
     } 
    } 
} 

}

4,我也试图缓解当前视图,但它并不能免除所有。如果你播放大量视频内存会很高,最终的应用程序将被杀死。

5.我不知道加载视频后是否会产生脏内存?

这是我的应用程序启动内存:13M 本次测试的一些视频和我弹出的看法:再次 enter image description here 本次测试的一些视频和流行的观点: enter image description here

6.Finally,我希望你能帮助我,非常感谢你。

回答

1

它看起来并不像你曾经从视图中删除的AVPlayerLayer:

[self.playerLayer removeFromSuperlayer]; 

我也看不到@autoreleasepool点这里,特别是如果你有ARC打开(你几乎肯定做! )。 @autoreleasepool通常只在您关闭ARC或在单个主循环调用中搅动大量内存(如,以兆字节为单位)并且需要控制何时清理时才有用。

+0

是的,这是我的错,但问题不在这里,我尝试添加到它,但它不起作用。 –

+0

你是什么意思“它不工作”?它崩溃? – damian

+0

是的,我发现这个代码导致了这个问题。 self.player = [AVPlayer playerWithPlayerItem:self.playItem];我不知道如何解决。 –