2015-09-08 156 views
1

我正在實現AVPlayer(不是AVAudioPlayer)並嘗試從URL播放音頻。它工作正常。但正如我們所知,有時我們可能會有無效的URL(沒有音頻字節的URL)。 當我從任何URL播放音頻AVPlayer狀態顯示總是AVPlayerStatusReadyToPlay這是錯誤的。例如:在URL的一部分,如果放棄無效的網址,如:http://soundx.mp3slash.net/indian/jhankar_beats/1%28mp3pk.com%29.mp3(它不會在瀏覽器中工作的偶數),即使你給https://stackoverflow.com/questions/ask或任何網站的網址(不具備音頻字節),AVPlayer總是顯示AVPlayerStatusReadyToPlay 。 我認爲在這種情況下它的狀態必須是AVPlayerItemStatusUnknown或AVPlayerStatusFailed請幫忙,如何知道URL無效(AVPlayerItemStatusUnknown或AVPlayerStatusFailed)表明我可以向用戶顯示消息。 在此先感謝AVPlayer狀態AVPlayerStatusFailed無法正常工作

-(void)playButtonClicked 

{

 NSURL *url = [NSURL URLWithString:AUDIO_URL]; 
     [self.audioSliderBar setMinimumValue:AUDIO_SLIDER_BAR_0]; 
     playerItem = [AVPlayerItem playerItemWithURL:url]; 
     player = [AVPlayer playerWithPlayerItem:playerItem]; 
     player.volume=5.0; 


     [player addObserver:self forKeyPath:STATUS options:0 context:nil]; 

     [playerItem addObserver:self forKeyPath:PLAY_BACK_BUFFER_EMPTY options:NSKeyValueObservingOptionNew context:nil]; 
     [playerItem addObserver:self forKeyPath:PLAY_BACK_LIKELY_TO_KEEP_UP options:NSKeyValueObservingOptionNew context:nil]; 

     addObserverFlag=YES; 

}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change: (NSDictionary *)change context:(void *)context 
{ 
    if (object == player && [keyPath isEqualToString:STATUS]) 
    { 
     if (player.status == AVPlayerStatusFailed) 
     { 

      [ViewUtilities showAlert:AUDIO_PLAYER :AUDIO_PLAYER_FAILED_MESSAGE]; 

     } 

     else if (player.status == AVPlayerStatusReadyToPlay) 
     { 

      else if (player.status == AVPlayerItemStatusUnknown) 
     { 
      [ViewUtilities showAlert:AUDIO_PLAYER :AUDIO_PLAYER_UNKNOWN]; 

     } 

     if (!player) 
     { 
      return; 
     } 
    } 
}` 
+0

你是不是顯示你與AVPlayer做什麼的狀態屬性來檢查特定項目的狀態。 – gnasher729

+0

AVPlayer在您開始播放之前不會檢查任何內容,或者例如使用預卷。 – gnasher729

+0

@ gnasher729,我已更新我的代碼,現在請看看。 –

回答

3

AVPlayer Doc狀態

狀態屬性的可能值,指示是否可以成功玩項目

AVPlayerStatusReadyToPlay 表示玩家已準備好玩AVPlayerItem實例。

所以我認爲你需要通過類型AVPlayerItemStatus

+0

謝謝@ Yurii,你是英雄。我在錯誤的對象(播放器)上添加觀察者,它應該在playerItem(在我的上面的代碼中)。在添加到觀察者playerItem而不是玩家之後,它就像魅力一樣。謝謝 –

+0

請將此答案標記爲解析。如果你想知道,我自2011年以來第一次閱讀AVPlayer的文檔。 –

+0

@ Yurii,完成(答案爲分辨率)在我身邊,謝謝 –