oc 歌词解析

歌词file:
[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
{
      NSMutableArray * _array;      //存储解析得到的单词
//      LrcMassage * _message;    //存储信息
}

- (id)initWithFile:(NSString *)path
{
      if (self = [super init]) {
            _array = [[NSMutableArray alloc] init];
            _message = [[LrcMassage alloc] init];
            //解析相关路径的文件
            [self paserLrcFile:path];
      }
      return self;
}



//歌词其实就是一个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 * contents = [self readFile:path];
      //解析歌词内容
      [self paserLrcFileContents:contents];
      //数组排序
      [self sortArray];
}

//读取文件,返回文件内容
- (NSString *)readFile:(NSString *)path
{
      NSString * contents = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
      return contents;
}

//解析歌词内容
- (void)paserLrcFileContents:(NSString *)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];
            }
      }
}

//解析一句歌词,存入数据模型
- (void)paserLrcEach:(NSString *)lrcEach
{
      //字符串分割 以]为分割符
      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];
            }
      }
}


//解析曲目的信息
- (void)paserLrcMessage:(NSString *)message
{
      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];
      }

}

//给一个时间字符串,返回对应的秒数
- (float)sencondsForTime:(NSString *)time
{    //[00:15.26
      NSArray * timeArray = [time componentsSeparatedByCha ractersInSet:[NSCharacterSet characterSetWithCharacte rsInString:@"[:"]];
      //取出分
      float minute = [timeArray[1] floatValue];
      //取出秒
      float seconds = [timeArray[2] floatValue];
      return minute * 60 + seconds;
}


//数组排序
- (void)sortArray
{
      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];
                  }
            }
      }
}

- (NSString *)lrcInTime:(float)time
{
      for (NSInteger i = _array.count - 1; i >= 0; i--) {
            if ([_array[i] seconds] < time) {
                  return [_array[i] lrcEach];
            }
      }
      return nil;
}

#define PATH @"/Users/pansongbiao/Downloads/qfile-4.txt"

+ (void)test
{
      LrcManager * manager = [[LrcManager alloc] initWithFile:PATH];
      
      int i = 0;
      while (i++ < 200) {
            system("clear");
            NSLog(@"%@",manager.message);
            NSLog(@"\n%@", [manager lrcInTime:i]);
            sleep(1);
      }
      
}


@end
//main.m
#import
#import "LrcManager.h"

int main(int argc, const char * argv[])
{

      @autoreleasepool {
            
            [LrcManager test];
            
      }
      return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值