歌词file:
NSMutableArray * _array;
//存储解析得到的单词
if (self = [super init]) {
_array = [[NSMutableArray alloc] init];
_message = [[LrcMassage alloc] init];
//解析相关路径的文件
[self paserLrcFile:path];
}
return self;
//读取文件
NSString * contents = [self readFile:path];
//解析歌词内容
[self paserLrcFileContents:contents];
//数组排序
[self sortArray];
NSString * contents = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
return contents;
//使用回车分割
NSArray * contentArray = [contents componentsSeparatedByStr
ing:@"\n"];
//遍历每一行字符串
for (NSString * content in contentArray) {
//跳过空字符串
if ([content isEqualToString:@""] == YES) {
continue;
}
//判断这一行是否以@"[0"开头
if ([content hasPrefix:@"[0"] == YES) {
//解析这句歌词,存入歌词单句的数据模型中
[self paserLrcEach:content];
}else if([content hasPrefix:@"["] == YES){
[self paserLrcMessage:content];
}
}
//字符串分割 以]为分割符
NSArray * lrcArray = [lrcEach componentsSeparatedByStr
ing:@"]"];
for (NSString * lrc in lrcArray) {
if ([lrc hasPrefix:@"["] == YES) {
//获取秒数
float seconds = [self sencondsForTime:lrc];
//创建数据模型
PSBLrcEach * each = [[PSBLrcEach alloc] init];
each.seconds = seconds;
each.lrcEach = lrcArray[lrcArray.count - 1];
//将数据模型,存入数组
[_array addObject:each];
}
}
NSArray * messageArray = [message componentsSeparatedByCha
ractersInSet:[NSCharacterSet characterSetWithCharacte
rsInString:@"[:]"]];
if ([messageArray[1] isEqualToString:@"ar"]) {
_message.ar = messageArray[2];
}else if([messageArray[1] isEqualToString:@"ti"]){
_message.ti = messageArray[2];
}else if([messageArray[1] isEqualToString:@"al"]){
_message.al = messageArray[2];
}else if([messageArray[1] isEqualToString:@"by"]){
_message.by = messageArray[2];
}else if([messageArray[1] isEqualToString:@"offset"]){
_message.offset = [messageArray[2] floatValue];
}
NSArray * timeArray = [time componentsSeparatedByCha
ractersInSet:[NSCharacterSet characterSetWithCharacte
rsInString:@"[:"]];
//取出分
float minute = [timeArray[1] floatValue];
//取出秒
float seconds = [timeArray[2] floatValue];
return minute * 60 + seconds;
for (int i = 0; i < _array.count - 1; i++) {
for (int j = 0; j < _array.count - 1 - i; j++) {
if ([_array[j] seconds] > [_array[j + 1] seconds]) {
[_array exchangeObjectAtIndex:j withObjectAtIndex:j + 1];
}
}
}
for (NSInteger i = _array.count - 1; i >= 0; i--) {
if ([_array[i] seconds] < time) {
return [_array[i] lrcEach];
}
}
return nil;
LrcManager * manager = [[LrcManager alloc] initWithFile:PATH];
int i = 0;
while (i++ < 200) {
system("clear");
NSLog(@"%@",manager.message);
NSLog(@"\n%@", [manager lrcInTime:i]);
sleep(1);
}
@autoreleasepool {
[LrcManager test];
}
return 0;
[ti:传奇]
[ar:王菲]
[00:03.50]传奇
[00:19.10]作词:刘兵 作曲:李健
[00:20.60]演唱:王菲
[00:26.60]
[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
[04:49.00]
[02:47.44][00:43.69]再也没能忘掉你容颜
[02:54.83][00:51.24]梦想着偶然能有一天再相见
[03:02.32][00:58.75]从此我开始孤单思念
[03:08.15][01:04.30]
[03:09.35][01:05.50]想你时你在天边
[03:16.90][01:13.13]想你时你在眼前
[03:24.42][01:20.92]想你时你在脑海
[03:31.85][01:28.44]想你时你在心田
[03:38.67][01:35.05]
[04:09.96][03:39.87][01:36.25]宁愿相信我们前世有约
[04:16.37][03:46.38][01:42.47]今生的爱情故事 不会再改变
[04:24.82][03:54.83][01:51.18]宁愿用这一生等你发现
[04:31.38][04:01.40][01:57.43]我一直在你身旁 从未走远
[04:39.55][04:09.00][02:07.85]
首先分析一下这个歌词,每句歌词对应好几个时间,每个时间不只是一秒的时间,而是一段时间。你有什么思路呢?分割分割再分割,然后用字典键值对,根据时间输出歌词,额,这个方法是不是谈麻烦了。
【代码】
//LrcEach.h
#import
@interface LrcEach : NSObject
@prooerty float seconds;
@property NSString * lrcEach;
@end
//LrcEach.m
#import "LrcEach.h"
@implementation LrcEach
@end
//LrcMessage.h
#import
@interface LrcMassage :NSObject
@property NSString * ar;
@property NSString * ti;
@property NSString * al;
@property NSString * by;
@property float offset;
@end
//LrcMassage.m
#import "LrcMassage.h"
@implementation LrcMassage
-(NSString *)description
{
return [NSString stringWithFormat:@"\n艺人:%@\n曲名:%@\n专辑:%@\n作曲:%@\n",_ar,_ti,_al,_by];
}
@end
//LrcManager.h
@class LrcMassage;
@interface LrcManager : NSObject
@property (readonly) LrcMassage *message;
-(id)initWithFile:(NSString *)path;
-(NSString *)lrcInTime:(float)time;
+(void)test;
@end
//LrcManager.m
#import "LrcManager.h"
#import "LrcEach.h"
#import "LrcMassage.h"
//@interface PSBLrcManager ()
//{
//
NSMutableArray * _array;
//存储解析得到的单词
//}
//@end
//匿名类别中声明的成员变量和方法,不对外公开,只能被当前类的成员方法调用。
@implementation LrcManager
{
//
LrcMassage * _message;
//存储信息
}
- (id)initWithFile:(NSString *)path
{
}
//歌词其实就是一个LRC文件,里面存放了所有的歌词
//
//类似于
//[ti:传奇]
//[ar:王菲]
//
//[00:03.50]传奇
//[00:19.10]作词:刘兵 作曲:李健
//[00:20.60]演唱:王菲
//[00:26.60]
//[04:40.75][02:39.90][00:36.25]只是因为在人群中多看了你一眼
//[04:49.00]
//解析相关路径的文件,将歌词存储到数据模型中,再将数据模型存储到数组中
- (void)paserLrcFile:(NSString *)path
{
}
//读取文件,返回文件内容
- (NSString *)readFile:(NSString *)path
{
}
//解析歌词内容
- (void)paserLrcFileContents:(NSString *)contents
{
}
//解析一句歌词,存入数据模型
- (void)paserLrcEach:(NSString *)lrcEach
{
}
//解析曲目的信息
- (void)paserLrcMessage:(NSString *)message
{
}
//给一个时间字符串,返回对应的秒数
- (float)sencondsForTime:(NSString *)time
{
//[00:15.26
}
//数组排序
- (void)sortArray
{
}
- (NSString *)lrcInTime:(float)time
{
}
#define PATH @"/Users/pansongbiao/Downloads/qfile-4.txt"
+ (void)test
{
}
@end
//main.m
#import
#import "LrcManager.h"
int main(int argc, const char * argv[])
{
}