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;
}
}
}










