2016-09-15 4 views
1

スナップショットと同様のビデオ再生をサポートするアプリケーションで作業しています(複数のリモートビデオをタップできます)。いくつかのビデオをタップした後、バッファリングは遅くなるように見え、ある時点で完全な停止になります。私にメモリリークのように聞こえる。AVPlayersは時間の経過とともにバッファーが遅くなります

私はAVPlayers、AVPlayerItems、およびAVPlayerLayersがすべて割り当て解除されていることをInstrumentsで確認しました。私は見つけるだけでリークがこれらです:

enter image description here

しかし、接続グラフとメモリ使用量を研究することによって、私ははっきりと見ることができるにもビデオプレーヤーを解雇し、アプリのカメラビューに座った後、いくつかのバッファリングがまだ発生しています。ネットワークアクティビティはかなり高く維持され、メモリは徐々に増加します。

動画の再生方法を理解するには、ここで簡単に説明します。私はVideoPlayerオブジェクトを持っていますが、そのうちの1つだけを開始してから、再生する新しいアセットを与えます。新しい資産を提供する前に、私はstopBufferingに電話します。何も残っていないことを確認するだけです(私たちはどれほど成功したかを見ています)。

- (void)stopBuffering 
{ 
    [self removeObservers]; 
    [self.player pause]; 
    [self.avPlayer replaceCurrentItemWithPlayerItem:nil]; 
    self.avPlayer = nil; 
    self.player = nil; 
    self.playerItem = nil; 
} 

新しいアセットが読み込まれるたびにこのメソッドが呼び出されることを確認しました。 これはすべてのヒープ&匿名VMグラフです。第1世代はビデオの再生前、第3世代はビデオプレーヤーから出ています。その間に、私はすぐに約20のビデオに飛びついた。

enter image description here

答えて

1

この理由は、私は、アセットをロードするたびにloadValuesAsynchronouslyForKeysで値をロードし始めたということでしたが、私は完了し、このメソッドの前に次の資産に移動した場合、私はそれをキャンセルしたことがありません。プロパティとしてAVURLAssetを格納し、適切な時期に

[self.asset cancelLoading]; 

を呼び出した後、問題が消えました。

関連する問題