音乐播放器的歌词解析和歌词自动滚动

在开发过程中, 经常会要做一个附带音乐播放功能的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];

}

 

总的来说这些代码并不算难, 但有时也比较常用, 只要做一些逻辑判断相信都能写出来

posted @ 2016-03-23 21:38  ykStruggle  阅读(416)  评论(0)    收藏  举报