2016-05-30 7 views
0

まずはご協力いただきありがとうございます。iOS AVPlayerで動画がたくさん再生され、メモリが高すぎる

質問:

1.Iはvideos.Iはビデオをテストするために2つのメソッドを書いた多くのことをテストする必要があります。

たら、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.Iは、現在のビューを緩和しようとしたが、それはすべてを軽減しません。大量のビデオメモリを再生すると、最終的なアプリが殺されます。

5.ビデオをロードした後で汚れたメモリが生成されるのだろうか?

この私のアプリがメモリを開始:13M このテストいくつかのビデオと私はビューポップ:再び enter image description here このテストいくつかの動画を、ビューをポップ: enter image description here

6.Finallyが、私はあなたが役立つことを願って私、大変ありがとうございました。

答えて

1

それはあなたがビューからAVPlayerLayerを削除しているようには見えません。

[self.playerLayer removeFromSuperlayer]; 

また、私はあなたがARCあなたはほぼ確実に行ういる(オンになっている場合は特に、ここで@autoreleasepoolのポイントを見ることができません! )。 @autoreleasepoolは、通常、ARCをオフにしている場合や、1回のメインループ呼び出しで大量のメモリ(多くのメガバイトなど)をチャーニングして、いつクリーンアップするかを制御する必要がある場合にのみ役に立ちます。

+0

はい、これは私の間違いですが、問題はここにはなく、追加しようとしていますが動作しません。 –

+0

「それはうまくいかない」とはどういう意味ですか?それはクラッシュする? – damian

+0

はい、問題の原因となっているこのコードが見つかりました。 self.player = [AVPlayer playerWithPlayerItem:self.playItem];私は解決する方法を知らない。 –

関連する問題