这两天做了个小名目触及到了远程音乐播放,无锡微信餐饮平台,由于第一次做这种音乐名目,无锡安卓开发,边查材料边做,其中触及到次要技术点有:
如何播放远程网络音乐
如何切换以后正在播放中的音乐资源
如何监听音乐播放的各种形态(播放器形态、播放的进度、缓冲的进度,播放实现)
如何手动操控播放进度
如何在后台形式或许锁屏情况下失常播放音乐
如何在锁屏形式下显示音乐播放信息和远程操控音乐
假设您对一块技术点有兴味或许正在寻觅相干材料,那么本篇或者能提供一些参考或启示。
二、 网络音乐播放的外围技术点
依据本人的阅历和查了一些音乐播放的相干材料,最简略和最易上手的的技术计划我想应该是采用ios系统自带的AVFoundation框架。
咱们知道AVFoundation框架是苹果专门为多媒体打造的一个库,这个库十分强大,专门用来解决音视频等简单的多媒体技术,而本篇要讲的一切技术点就是基于AVFoundation框架中的一个类――AVPlayer。
那么AVPlayer是什么?
你可能把他看成是一个已经封装好的播放器,它的作用是用来播放远程的或本地的视频和音频。由于本地的音视频的播放比较简略,这里就不做讲述,本编次要是讲远程音乐播放,由于都是基于AVPlayer同一套API,所以掌握远程音乐播放其实就是相当于掌握远程视频播放。好了废话就不多说了,下面末尾上菜。
1、导入AVFoundation框架,创建AVPlayer播放器
-(AVPlayer *)player { if (_player == nil) { // AVPlayerItem是一个包装音乐资源的类,初始化时可能传入一个音乐的url AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:@"http://xxxxxxxx"]]; //经过AVPlayerItem初始化player _player = [[AVPlayer alloc] initWithPlayerItem:item]; } return _player; }
此处懒加载创建,让播放器成为控制器的全局属性,留意需求强引用,否则回收监禁掉了就无奈播放。
2、播放或中止音乐
//末尾播放 [self.player play]; //中止播放 [self.player pause];
这个没什么好讲的,只需调用AVPlayer的两个实例方法
3、切换以后正在播放中的音乐资源
//创建需求播放的AVPlayerItem AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:model.url]]; //交流以后音乐资源 [self.player replaceCurrentItemWithPlayerItem:item];
这个可能用于歌曲的切换,如上一首、下一首。
4、经过KVO监听播放器的形态
[self.player.currentItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionNew context:nil];
拿到播放器的currentItem,注册以后对象为观察者,监听它的status属性。status属性是AVPlayerItemStatus类型,它是一个枚举类型,如下:
typedef NS_ENUM(NSInteger, AVPlayerItemStatus) { AVPlayerItemStatusUnknown,//未知形态 AVPlayerItemStatusReadyToPlay,//预备播放 AVPlayerItemStatusFailed//加载失败 };
当status属性值发生扭转时,就会触发观察者方法的回调,如下:
//观察者回调 -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)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属性。咱们先看监听,如下:
//KVO监听音乐缓冲形态 [self.player.currentItem addObserver:self forKeyPath:@"loadedTimeRanges" options:NSKeyValueObservingOptionNew context:nil];
当 loadedTimeRanges属性发生扭转时,回调如下:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if ([keyPath isEqualToString:@"loadedTimeRanges"]) { NSArray * timeRanges = self.player.currentItem.loadedTimeRanges; //本次缓冲的工夫范围 CMTimeRange timeRange = [timeRanges.firstObject CMTimeRangeValue]; //缓冲总长度 NSTimeInterval totalLoadTime = CMTimeGetSeconds(timeRange.start) + CMTimeGetSeconds(timeRange.duration); //音乐的总工夫 NSTimeInterval duration = CMTimeGetSeconds(self.player.currentItem.duration); //计算缓冲百分比例 NSTimeInterval scale = totalLoadTime/duration; //更新缓冲进度条 self.loadTimeProgress.progress = scale; } }