2012-05-01 7 views
0

私はAVPlayerLayerAVPlayerで私のアプリでビデオプレーヤーをビルドします。AVPlayerLayerとAVPlayer

新しいビデオは、私はこの方法を行う選択された場合:

//this to remove the current video 
    if (avPlayerLayer) { 
      [[NSNotificationCenter defaultCenter] removeObserver:self name:AVPlayerItemDidPlayToEndTimeNotification object:[audioPlayer currentItem]]; 
      [avPlayerLayer.player pause]; 
      [avPlayerLayer removeFromSuperlayer]; 
      avPlayerLayer = nil; 
    } 

//and this is to add a new one 
    audioPlayer = [[AVPlayer alloc]initWithURL:[NSURL fileURLWithPath:fileName]]; 
    avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:audioPlayer] retain]; 
    [avPlayerLayer setFrame:self.view.bounds]; 

    CGRect frame = avPlayerLayer.frame; 
    [avPlayerLayer setFrame:CGRectMake(frame.origin.x, frame.origin.y - 30, frame.size.width, frame.size.height)]; 

    [[self.view layer] addSublayer:avPlayerLayer]; 

    [audioPlayer play]; 

    [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(finishPlayingSong) 
                name:AVPlayerItemDidPlayToEndTimeNotification 
                object:[audioPlayer currentItem]]; 
    [audioPlayer release]; 

さて、私はデバイスがビデオの再生を開始しないで、この方法を実行し、いくつかの回(それはだ同時に発生していない同じ映像上)。それはなぜ起こるか?どのように私はそれを処理することができますか?

編集

私は5曲を演奏した後に気付きました。

+0

avplayerの代理メソッドが利用可能な場合、なぜ通知を使用していますか? audioplayer.delegate = nilを設定して、audioplayerをnilに設定し、新しいプレーヤーを初期化しながらデリゲートをselfに設定します。 –

+0

AVPlayerには代理メソッドがありますか?本気ですか? – MTA

+0

申し訳ありませんが、私の混乱は、デリゲートメソッドを持つAVAudioplayerです。 –

答えて

0

入力を変更するだけで新しいAVPlayerインスタンスとAVPlayerLayerインスタンスを作成する必要はありません。本当に必要なのは、新しいAVPlayerItemだけです。それを現在のAVPlayerに割り当て、既存のAVPlayerLayerを引き続き使用します。

1

メモリリークがあります。 alloc: init:AVPlayerを作成し、audioPlayerに割り当てるたびに作成します。これにより、保持カウントが1になります。次に、保持カウントを再びインクリメントするAVPlayerLayerを作成します。

その後、avPlayerLayerを解放して、保持カウントをaudioPlayerに減らしますが、決してゼロに戻らず決して割り当てが解除されません。

漏れが悪いですが、別の問題も発生しています。 iOSのインフラストラクチャの制限はa maximum of 4 audio/video render pipelinesです。 5番目を作成すると、レンダリングパイプラインを取得することができないため、再生に失敗します。

問題を解決するには、メモリリークを修正してください。暗黙のうちにそのオブジェクトの保持カウントをデクリメントし、漏れを避け、autorelease:を実行しますplayerWithURL:静的なファクトリコンストラクタを使用して

audioPlayer = [AVPlayer playerWithURL:[NSURL fileURLWithPath:fileName]]; 

-1

一般に、MPMovieプレーヤーをカスタマイズするには、AVPlayerを使用してAVPlayerLayerを使用することをお勧めします。

このカスタマイズされたプレーヤーを使用すると、好きなようにプレーヤーのコントロール(再生/一時停止、後退、前進、停止、音量など)をカスタマイズできます。

関連する問題