2012-05-01 73 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設置爲零,並在初始化新玩家時,將該代表設置爲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。當您創建第五個時,它無法抓取渲染管道,因此播放失敗。

要解決您的問題,請糾正內存泄漏。

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

使用playerWithURL:靜態工廠構造將隱式執行autorelease:,遞減該對象的保留計數,並避免泄漏。

-1

一般來說,要定製您的MPMovie播放器,最好使用帶有AVPlayer的AVPlayerLayer。

通過使用此自定義播放器,您可以隨意自定義播放器控件(播放/暫停,向後,向前,停止和音量等)。