今天分享一个歌词显示的项目,首先让我们来看看一般歌词是什么样的格式,就拿神曲《小苹果》来说的,请看歌词:
[00:00.91]小苹果
[00:01.75]作词:王太利 作曲:王太利
[00:02.47]演唱:筷子兄弟
[00:03.32]
[00:17.40]我种下一颗种子
[00:19.12]终于长出了果实
[00:21.04]今天是个伟大日子
[00:25.10]摘下星星送给你
[00:26.79]拽下月亮送给你
[00:28.77]让太阳每天为你升起
[00:31.25]
[00:32.67]变成蜡烛燃烧自己
[00:34.47]只为照亮你
[00:36.44]把我一切都献给你
[00:38.22]只要你欢喜
[00:40.19]你让我每个明天都
[00:42.15]变得有意义
[00:44.04]生命虽短爱你永远
[00:46.08]不离不弃
[00:47.81]
[00:48.15]你是我的小呀小苹果儿
[00:51.92]怎么爱你都不嫌多
[00:55.26]红红的小脸儿温暖我的心窝
[00:59.33]点亮我生命的火 火火火火
[01:03.45]你是我的小呀小苹果儿
[01:07.06]就像天边最美的云朵
[01:10.61]春天又来到了花开满山坡
[01:14.70]种下希望就会收获
新建一个java类Lyrc来表示歌词
public class Lyrc {
public String lrcString; //歌词
public int sleepTime; //一行歌词的持续时间
public int timePoint; //一行歌词结束的时间点
}
新建java类对歌词进行处理,歌词中一行里有时间[00:48.15],用[ ]括起来,紧接着是歌词内容,我们一行一行的将歌词读入,并将时间和歌词分离。
public class LyrcUtil {
private static List<Lyrc> lyrcList;
/**
* 读取歌词文件文件
* @param f
* @return
*/
public static List<Lyrc> readLRC(File f) {
try {
if (f == null || !f.exists()) {
lyrcList = null;
} else {
lyrcList = new Vector<Lyrc>();
InputStream is = new BufferedInputStream(new FileInputStream(f));
BufferedReader br = new BufferedReader(new InputStreamReader(is, getCharset(f)));
String strTemp = "";
while ((strTemp = br.readLine()) != null) {
strTemp = analyzeLRC(strTemp);
}
br.close();
is.close();
// 对歌词进行排序
Collections.sort(lyrcList, new Sort());
// 计算每行歌词的停留时间
for (int i = 0; i < lyrcList.size(); i++) {
Lyrc one = lyrcList.get(i);
if (i + 1 < lyrcList.size()) {
Lyrc two = lyrcList.get(i + 1);
one.sleepTime = two.timePoint - one.timePoint;
}