音乐播放器的歌词解析和歌词自动滚动
在开发过程中, 经常会要做一个附带音乐播放功能的Demo, 而歌词的解析和歌词自动滚动是会让本来平平的Demo凭增不要色彩的, 下面说一下其主要方法
歌词多是lrc格式的, 里面可以看做是存放了一个字符串, 而歌词的格式都是固定的, 例如:
[ver:v1.0]
[ti:天籁童声-情非得已]
[00:00.52]情非得已 - 天籁童声
[00:12.97]难以忘记初次见你
通常每行都由一个[], 中间是每句歌词的时间值, 后面是歌词的内容, 可以通过一些字段的判断来截取出每句歌词内容和时间, 然后存放在数组中, 方便以后的提取使用.
代码如下
/** 歌词解析方法 */
-(void)parselyric:(MusicModel *)music {
// 先通过歌词文件名获取歌词文件
NSString *path = [[NSBundle mainBundle]pathForResource:music.musicName ofType:@"lrc"];
[self.lyrics removeAllObjects];
//if lyric file exits
if (path.length) {
// 编译歌词文件
NSString *lyc = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// 初始化两个可变数组用来存放时间和值
_musictime = [[NSMutableArray alloc] init];
_t = [[NSMutableArray alloc] init];
// 根据回车符打断, 添加入数组内
NSArray *arr = [lyc componentsSeparatedByString:@"\n"];
for (NSString *item in arr) {
//if item is not empty
if (item.length) {
// 通过[], 截取每一行的时间字符
NSRange startrange = [item rangeOfString:@"["];
// NSLog(@"%ld%ld",startrange.length,startrange.location);
NSRange stoPRange = [item rangeOfString:@"]"];
NSString *content = [item substringWithRange:NSMakeRange(startrange.location+1, stoPRange.location-startrange.location-1)];
// NSLog(@"%ld",[item length]);
//the music time format is mm.ss.xx such as 00:03.84
if ([content length] == 8) {
NSString *minute = [content substringWithRange:NSMakeRange(0, 2)];
NSString *second = [content substringWithRange:NSMakeRange(3, 2)];
NSString *mm = [content substringWithRange:NSMakeRange(6, 2)];
// 重新编辑时间格式
NSString *time = [NSString stringWithFormat:@"%@:%@.%@",minute,second,mm];
NSNumber *total =[NSNumber numberWithInteger:[minute integerValue] * 60 + [second integerValue]];
[_t addObject:total];
NSString *lyric = [item substringFromIndex:10];
// 将找的时间值和歌词字符串添加入数组
[_musictime addObject:time];
[self.lyrics addObject:lyric];
}
}
}
}
else
_lyrics = nil;
NSLog(@"时间:%@, 歌词:%@, &&%@", self.musictime, self.lyrics, self.t);
}
通过在viewController上加一个tableViewController来显示歌词, 然后根据时间来判断歌词是否该向下滚动了
代码如下
/** 歌词自动滚动 */
- (void)lyricToScroll {
CustomMusicHelper *custom = [CustomMusicHelper shareCustomMusicHelper];
CGFloat currentTime = custom.player.currentTime;
NSLog(@"%d:%d",(int)currentTime / 60, (int)currentTime % 60);
for (int i = 0; i < self.musictime.count; i++) {
NSArray *timeArray=[self.musictime[i] componentsSeparatedByString:@":"];
float lrcTime=[timeArray[0] intValue] * 60 + [timeArray[1] floatValue];
if(currentTime > lrcTime){
_currentLine = i;
}else
break;
}
// 更新tableView
[self.lyrTableView reloadData];
// 自动滚动
[self.lyrTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:_currentLine inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}
总的来说这些代码并不算难, 但有时也比较常用, 只要做一些逻辑判断相信都能写出来

浙公网安备 33010602011771号