【问题标题】:iOS AVPlayer play a lot videos and cause memory too highiOS AVPlayer 播放大量视频导致内存过高
【发布时间】:2016-09-28 02:39:32
【问题描述】:

首先,感谢您的帮助。

问题:

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

2.播放视频状态变化时,我设置了avPlayer = nil和avPlayerItem = nil,我也加了@autoreleasepool {},但是内存慢慢变大了,我用了instruments没发现内存泄露,我找了很多问题,没有找到解决办法。

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

【问题讨论】:

标签: ios memory avplayer


【解决方案1】:

您似乎从未从视图中删除 AVPlayerLayer:

[self.playerLayer removeFromSuperlayer];

我也看不到@autoreleasepool 的意义,特别是如果你打开了 ARC(你几乎肯定会这样做!)。 @autoreleasepool 通常仅在您关闭 ARC 时有用,或者当您在单个主循环调用中处理大量内存(如数兆字节)并且需要控制它们何时被清理时。

【讨论】:

  • 是的,这是我的错误,但问题不在这里,我尝试添加它,但它不起作用。
  • 是的,我找到了导致问题的代码。 self.player = [AVPlayer playerWithPlayerItem:self.playItem];不知道怎么解决。
  • 如果你不从它的超层中移除AVPlayerLayer,你将会泄露 AVPlayerLayer 以及它所引用的所有东西(包括 AVPlayer 实例和 AVPlayerItem 实例)。 是你的问题。
  • 我知道,但是我加了这句话,内存没有释放和清理
猜你喜欢
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2016-12-15
  • 2015-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多