iOS AVPlayer播放了大量视频并导致内存过高

时间:2016-05-30 09:57:18

标签: ios memory avplayer

首先,谢谢你的帮助。

问题:

1.我需要测试很多视频。我写了两种测试视频的方法。

2.播放视频状态时,我设置了avPlayer = nil和avPlayerItem = nil,我也添加了@autoreleasepool {},但内存慢慢增加,我使用的是仪器,但我没有发现内存泄漏,我发现很多问题并没有找到解决方案。

3.这是我的代码:

-(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.最后,我希望你能帮助我,非常感谢你。

1 个答案:

答案 0 :(得分:1)

看起来您从视图中删除AVPlayerLayer似乎不是:

[self.playerLayer removeFromSuperlayer];

此外,我无法在@autoreleasepool看到这一点,特别是如果你打开ARC(你几乎肯定会这样做!)。 @autoreleasepool通常仅在您关闭ARC时,或者在单个主循环调用中通过大量内存(如数兆字节)进行搅拌时才有用,并且需要控制它们何时被清除。