音乐播放器很久以前就想写一个,但无论如何水平不够,而且非常不勤奋。 拖拖拉拉直到现在才解析了lrc歌词。 网上有很多关于歌词分析的例子。 各有各的写法。 我想随便复印一下就结束了,觉得不方便,就老实自己写了分析。 要分析我想先知道格式,现在进入正题。
lrc文件通常是存储音乐歌词文件的地方,里面的格式大致分为三种,一种是[ti:],这样的一般是歌手、歌词制片人; 一种是[00:01.67],这是时间戳,格式为mm:ss:ff,是歌词的时间,用它来判断何时显示什么歌词; 最后一个类别是歌词的内容。 大概的格式是这样的。 接下来就是根据格式剪切和转换数据,使之成为自己想要的数据。
接下来直接上代码,程序猴子相信看代码会很容易。 首先定义LrcRow类。 publicclasslrcrowimplementscomparable {
公共字符串流;
公共长时间;
公共字符串内容;
公共LRC row () {
} publiclrcrow (字符串流、长时间、字符串内容)。
this.strTime=strTime;
this.time=time;
this.content=content;
}@Override
公共字符串字符串
返回' [ ' strtime ' ] ' content;
}
其中三个参数,strtime是用于转换的时间,time是用于判断该歌词显示的时间,content是歌词的内容,只是一个简单的类。
接下来是正式解析。 publicstaticlrcrowanalysis _ lyrics (字符串线)。
intstart=line.indexof('[ ' );
intstop=line.indexof (' );
if (开始!=-1停止!=-1 ()
LrcRow lrcrow=newLrcRow (;
string result=line.substring (开始1,stop );
lrcrow.strTime=result;
if (! result.equals(ti: )! result.equals(ar: )! result.equals(al: ) ) }{
LRCrow.time=getlong(result );
} string content=line.substring (stop1);
内容!=空! content.equals (' ' ) {
lrcrow.content=content;
}else{
lrcrow.content=' ';
}
returnlrcrow;
}
返回空值;
}隐私统计龙(stringtime ) )
stringm=time.substring(0,time.indexof(': ' );
strings=time.substring (time.indexof (' : ' ) ) 1,time.index of ).);
string ms=time.substring (time.index of ('.' ) 1,time.length );
转换为returninteger.valueof(m ) *60*1000//毫秒
转换为integer.valueof(s ) *1000//毫秒
integer.valueof(ms;
}
首先,得到歌词。 首先得到[]、位数和内容。 当然,它可能是空字符串。 于是用-1判断了。 获取[]中的内容后,如果是时间戳,则调用getlong方法,将时间戳转换为毫秒值并返回。 当然,我判断是否是时间戳的条件不是最佳方案。 我在这里偷懒了。 继续变更,拿着。 取歌词的内容很简单。 ]后面的歌词全部拿出来就可以了,有些行只占时间,没有内容,也需要别的判断。 果然歌词显示不完,长时间不动的话,用户体验也会变得相当差。 内容分类后,用new一个LrcRow,保存全部数据,按照时间顺序排列歌词。 文件读取有优先顺序,但请做好以防万一的准备
公共int比较到(lrcrowo ) {
返回(int ) ) time- o.time;
}
至此,lrc歌词文件的分析完成。 期待您的指正