0

とを使用してアプリでビデオプレーヤーを作成し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曲を演奏した後にそれが起こることに気づきました。

4

3 に答える 3

2

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

後で、avPlayerLayer保持カウントをデクリメントするを解放しaudioPlayerますが、ゼロに戻ることはなく、したがって割り当てが解除されることはありません。

リークは悪いですが、あなたも別の問題に直面しています。iOSには、最大4つのオーディオ/ビデオレンダリングパイプラインに対するインフラストラクチャの制限があります。5つ目を作成すると、レンダリングパイプラインを取得できないため、再生が失敗します。

問題を解決するには、メモリリークを修正します。

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

playerWithURL:静的ファクトリコンストラクタを使用すると、暗黙的にが実行されautorelease:、そのオブジェクトの保持カウントが減少し、リークが回避されます。

于 2013-06-17T20:52:12.910 に答える
0

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

于 2013-03-24T17:57:07.863 に答える
-1

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

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

于 2013-07-12T13:44:07.427 に答える