iOS利用AVPlayer播放网络音乐的方法教程

2020-01-20 23:06:02王冬梅

一般初始化player到播放都会经历Unknown到ReadyToPlay这个过程,网络情况良好时可能不会出现Unknown状态的提示,网络情况差的时候Unknown的状态可能会持续比较久甚至可能不进入ReadyToPlay状态,针对这种情况我们要做特殊的处理。

播放完成之后需要移除观察者:


[songItem removeObserver:self forKeyPath:@"status"];

(2) 数据缓冲状态


[songItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];

然后可以在KVO方法中获取其status的改变


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context { 
 AVPlayerItem * songItem = object;
 if ([keyPath isEqualToString:@"loadedTimeRanges"]) {
  NSArray * array = songItem.loadedTimeRanges;  
  CMTimeRange timeRange = [array.firstObject CMTimeRangeValue]; //本次缓冲的时间范围
  NSTimeInterval totalBuffer = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration); //缓冲总长度
  SuLog(@"共缓冲%.2f",totalBuffer);
 }
}

如果你需要在进度条展示缓冲的进度,可以增加这个观察者。

播放完成之后需要移除观察者:


[songItem removeObserver:self forKeyPath:@" loadedTimeRanges"];

(3) 播放完毕状态

监听AVPlayer播放完成通知


[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:AVPlayerItemDidPlayToEndTimeNotification object:songItem];
- (void)playbackFinished:(NSNotification *)notice { 
 BASE_INFO_FUN(@"播放完成"); 
 [self playNext];
}

播放完毕后,一般都会进行播放下一首的操作。

播放下一首前,别忘了移除这个item的观察者:


[[NSNotificationCenter defaultCenter] removeObserver:self];

5、Remote Control控制音乐的播放

Remote Control可以让你在不打开APP的情况下控制其播放,最常见的出现于锁屏界面、从屏幕底部上拉和耳机线控三种,可以达到增强用户体验的作用。

我们在AppDelegate里去设置Remote Control:

(1)声明接收Remote Control事件


[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

(2)重写方法,成为第一响应者


- (BOOL)canBecomeFirstResponder { 
 return YES;
}

(3)对事件进行处理


- (void)remoteControlReceivedWithEvent:(UIEvent *)event {  
 switch (event.subtype) {  
  case UIEventSubtypeRemoteControlPlay:
   [self.player startPlay];
   BASE_INFO_FUN(@“remote_播放");
   break;  
  case UIEventSubtypeRemoteControlPause:   
   [self.player pausePlay];
   BASE_INFO_FUN(@"remote_暂停");
   break;  
  case UIEventSubtypeRemoteControlNextTrack:
   [self.player playNextSong];
   BASE_INFO_FUN(@"remote_下一首");
   break;  
  case UIEventSubtypeRemoteControlTogglePlayPause:   
   self.player.isPlaying ? [self.player pausePlay] : [self.player startPlay];   
   BASE_INFO_FUN(@“remote_耳机的播放/暂停");
   break;  
  default:   
   break; }
}