iOS实现播放远程网络音乐的核心技术点总结

2020-01-18 17:23:06王振洲

当status属性值发生改变时,就会触发观察者方法的回调,如下:


//观察者回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context
{
  //注意这里查看的是self.player.status属性
  if ([keyPath isEqualToString:@"status"]) {
    switch (self.player.status) {
      case AVPlayerStatusUnknown:
      {
        NSLog(@"未知转态");
      }
        break;
      case AVPlayerStatusReadyToPlay:
      {
        NSLog(@"准备播放");
      }
        break;
      case AVPlayerStatusFailed:
      {
        NSLog(@"加载失败");
      }
        break;
         default:
        break;
    }
  }
}

self.player.status ==  AVPlayerStatusReadyToPlay时,音乐就会开始正常播放,另外两种状态音乐是无法播放的,可以在上面方法相应状态里给出提示。这里需要特别强调一点的是观察者监听的对象是 self.player.currentItem,而不是 self.player,而当监听的属性发生改变时,观察者回调的方法里需要查看的是 self.player.status。当然,你也可以不这么干,但是我尝试过好几次,不这么干的后果是无法监听到 self.player.status属性的改变。

当音乐播放完成,或者切换下一首歌曲时,请务必记得移除观察者,否则会crash。操作如下:


//移除观察者
 [self.player.currentItem removeObserver:self forKeyPath:@"status"];

5、监听音乐的缓冲进度

这个也是通过KVO监听播放器当前播放的音乐资源AVPlayerItem的loadedTimeRanges属性。我们先看监听,如下: