摘要:本文将介绍笔者仿写QQ音乐播放器的主体思路.笔者在该项目中实现的主要功能有:横竖屏适配,本地音频播放,lrc类型歌词解析.展示及播放时变色处理,上下曲切换,后台运行模式设置,锁屏视图设置,播放打断处理等基本功能.接下来,也将在以上几个板块中选择一些音频开发中实用性强的功能做简要介绍.
一.播放功能的效果展示
二.本地音频播放的主体实现思路(思维导图展示)
三.歌词解析及展示
笔者用到的歌词文件类型为lrc(github上托管的项目中sources文件下,github托管地址:https://github.com/moonCai/SimpleMusicPlayer),将每句歌词作为一个模型(CYLyricModel),并将整首歌的歌词解析为模型数组.
第一张效果图和第二张效果图中每一句歌词的展示控件都是label,为了实现歌词的变色效果,自定义了UIColorLabel这个类,继承自UILabel.它的实现原理非常简单:设置一个progress属性,根据progress的值来设定填充区域.设定一个填充色(即当前正播放的歌词中已经播放过的部分的颜色),在指定的填充区域采用混合模式渲染.并在progress的setter方法中进行重绘,就能达到动态渲染的效果.代码如下:
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
//设置填充色
[[UIColor colorWithRed:45/255.0 green:185/255.0 blue:105/255.0 alpha:1.0] setFill];
//设置填充区域
rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width * self.progress, rect.size.height);
//渲染,在填充区域使用混个模式进行填充
UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn);
}
-(void)setProgress:(CGFloat)progress {
_progress = progress;
[self setNeedsDisplay];
}
第二张效果图的歌词展示控件是UIScrollView,展示每一句歌词的label也是UIColorLabel.根据当前播放歌词的索引来动态改变contentOffset,以实现播放中不断滚动的效果.
四.后台运行模式
仅仅打开后台运行模式的话,在真机上进行后台播放时,只会持续几秒钟就会挂起,如果想要持续在后台运行模式下播放,还需要在音频管理单例的初始化方法中开启音频会话,代码如下:
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
五.设置锁屏视图
如果手机锁屏了,音频还在进行播放.再次点开屏幕时的视图即为锁屏视图.以上代码为笔者在项目中的实现代码.在设置封面图片时,为了能显示歌词,采取了绘制的方式(项目中的方法名:drawImageWithArtWorkAndLyric):先绘制指定大小的封面图片,再在指定rect下绘制歌词文字.如果锁屏视图中没有显示歌词的需求,可采用以下方式设置封面图片:
MPMediaItemArtwork *artWork = [[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:music.image]];
六.应用开启远程控制,实现播放/暂停及自动切歌,音频打断的处理
以上为笔者仿写QQ音乐播放器的主体思路,项目在github上的开源地址:github.com/moonCai/SimpleMusicPlayer.欢迎交流探讨.