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

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

2、播放器的常用操作

播放:


[player play];

需要注意的是初始化完player之后不一定会马上开始播放,需要等待player的状态变为ReadyToPlay才会进行播放。

暂停:


[player pause];

上一首、下一首:

这里我们有两种方式可以实现,一种是由你自行控制下一首歌曲的item,将其替换到当前播放的item


[player replaceCurrentItemWithPlayerItem:songItem];

另一种是使用AVPlayer的子类AVQueuePlayer来播放多个item,调用advanceToNextItem来播放下一首音乐


NSArray * items = @[item1, item2, item3 ....];
AVQueuePlayer * queuePlayer = [[AVQueuePlayer alloc]initWithItems:items];

3、监听播放进度

使用addPeriodicTimeObserverForInterval:queue:usingBlock:来监听播放器的进度

      (1)方法传入一个CMTime结构体,每到一定时间都会回调一次,包括开始和结束播放

      (2)如果block里面的操作耗时太长,下次不一定会收到回调,所以尽量减少block的操作耗时

      (3)方法会返回一个观察者对象,当播放完毕时需要移除这个观察者

添加观察者:


id timeObserve = [self.player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0) queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
  float current = CMTimeGetSeconds(time);  
  float total = CMTimeGetSeconds(songItem.duration);  
  if (current) {   
    weakSelf.progress = current / total;   
    weakSelf.playTime = [NSString stringWithFormat:@"%.f",current];   
    weakSelf.playDuration = [NSString stringWithFormat:@"%.2f",total];  }
 }];

移除观察者:


if (timeObserve) {
  [player removeTimeObserver:_timeObserve];
  timeObserve = nil;
 }

4、监听改播放器状态

(1) 媒体加载状态


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

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


- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context {

 if ([keyPath isEqualToString:@"status"]) {
  switch (self.player.status) {   
   case AVPlayerStatusUnknown:    
    BASE_INFO_FUN(@"KVO:未知状态,此时不能播放");    
    break;   
   case AVPlayerStatusReadyToPlay:    
    self.status = SUPlayStatusReadyToPlay;     
    BASE_INFO_FUN(@"KVO:准备完毕,可以播放");    
    break;
   case AVPlayerStatusFailed:
    BASE_INFO_FUN(@"KVO:加载失败,网络或者服务器出现问题");
    break;   
   default:    
    break;  
  }
 }
}