2015-09-08 45 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,完成(答案为分辨率)在我身边,谢谢 –