java解析lrc文件代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解析lrc文件代码相关的知识,希望对你有一定的参考价值。

如题 有没有这方面的java代码
给我瞧瞧 谢谢了
我最近在做这个解析器
打算做一个音乐 播放器
想看看别人怎么做的
只是看看别人怎么进行解析lrc 就可以了
谢谢了

lrc可以通过如下util工具类进行转换,如果想知道结果是否读取的有问题,可以直接用记事本打开lrc文件的,之后和输出结果比对一下就行。

package com.routon.utils;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.util.Log;

/**
* parse lrc file tool
* eg:
* utilLrc lrc = new utilLrc("/sdcard/test.lrc");
* get song name : String title = lrc.getTitle();
* get performer name : String artist = lrc.getArtist();
* get album name: String album = lrc.getAlbum();
* get lrcmaker name: String lrcMaker = lrc.getLrcMaker();
* get song list: List<Statement> list = lrc.getLrcList();
*
* @author xuweilin
*
*/
public class utilLrc
private static String TAG = "utilLrc";
public class Statement
private double time = 0.0; //time, 0.01s
private String lyric = ""; //song word
/*
* get time
*/
public double getTime()
return time;

/*
* set time
*/
public void setTime(double time)
this.time = time;

/*
* set time.format:mm:ss.ms
*/
public void setTime(String time)
String str[] = time.split(":|\\.");
this.time = Integer.parseInt(str[0])*60+Integer.parseInt(str[1])+Integer.parseInt(str[2])*0.01;

/*
* get lrc word
*/
public String getLyric()
return lyric;

/*
* set lrc word
*/
public void setLyric(String lyric)
this.lyric = lyric;


private BufferedReader bufferReader = null;
private String title = "";
private String artist = "";
private String album = "";
private String lrcMaker = "";
private List<Statement> statements = new ArrayList<Statement>();

/*
*
* fileName
*/
public utilLrc(String fileName) throws IOException
FileInputStream file = new FileInputStream(fileName);
bufferReader = new BufferedReader(new InputStreamReader(file, "utf-8"));
readData();


/*
* read the file
*/
private void readData() throws IOException
statements.clear();
String strLine;
while(null != (strLine = bufferReader.readLine()))

if("".equals(strLine.trim()))

continue;

if(null == title || "".equals(title.trim()))

Pattern pattern = Pattern.compile("\\[ti:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())

title=matcher.group(1);
continue;


if(null == artist || "".equals(artist.trim()))

Pattern pattern = Pattern.compile("\\[ar:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())

artist=matcher.group(1);
continue;


if(null == album || "".equals(album.trim()))

Pattern pattern = Pattern.compile("\\[al:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())

album=matcher.group(1);
continue;


if(null == lrcMaker || "".equals(lrcMaker.trim()))

Pattern pattern = Pattern.compile("\\[by:(.+?)\\]");
Matcher matcher = pattern.matcher(strLine);
if(matcher.find())

lrcMaker=matcher.group(1);
continue;


int timeNum=0;
String str[] = strLine.split("\\]");
for(int i=0; i<str.length; ++i)

String str2[] = str[i].split("\\[");
str[i] = str2[str2.length-1];
if(isTime(str[i]))
++timeNum;


for(int i=0; i<timeNum;++i)

Statement sm = new Statement();
sm.setTime(str[i]);
if(timeNum<str.length)

sm.setLyric(str[str.length-1]);

statements.add(sm);


sortLyric();

/*
* judge the string is or not date format.
*/
private boolean isTime(String string)

String str[] = string.split(":|\\.");
if(3!=str.length)

return false;

try
for(int i=0;i<str.length;++i)

Integer.parseInt(str[i]);


catch(NumberFormatException e)

Log.e(TAG, "isTime exception:"+e.getMessage());
return false;

return true;

/*
* sort the word by time.
*/
private void sortLyric()

for(int i=0;i<statements.size()-1;++i)

int index=i;
double delta=Double.MAX_VALUE;
boolean moveFlag = false;
for(int j=i+1;j<statements.size();++j)

double sub;
if(0>=(sub=statements.get(i).getTime()-statements.get(j).getTime()))

continue;

moveFlag=true;
if(sub<delta)

delta=sub;
index=j+1;


if(moveFlag)

statements.add(index, statements.get(i));
statements.remove(i);
--i;



/**
* get title
* @return
*/
public String getTitle()
return title;

/**
* get artist
* @return
*/
public String getArtist()
return artist;

/**
* get album
* @return
*/
public String getAlbum()
return album;

/**
* get lrc maker
* @return
*/
public String getLrcMaker()
return lrcMaker;

/**
* get song list
* @return
*/
public List<Statement> getLrcList()
return statements;

参考技术A 看下我以前写的播放器吧。。带同步歌词的。。就是读取LRC文件

http://hi.baidu.com/282919088/blog/item/554f5510245234fbc2ce7968.html本回答被提问者采纳
参考技术B lrc文件本来就是个文本文件,用记事本打开看看就知道了
就按照读取文本文件一行一行读取就行了
再按实际要求对时间什么的做解析
参考技术C LRC文件本身就是文本文件,不用解析,直接按照读取文本文件读取就行!

如何制作一首歌的歌词 LRC 歌词制作和绑定

如何制作一首歌的歌词 LRC 歌词制作和绑定


1、简介

lrc是英文lyric(歌词)的缩写,被用做歌词文件的扩展名
以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示

2、写法格式

格式一
[00:01.500]在1.5秒时显示的歌词

格式二
[00:01]在1秒时显示的歌词

格式三
[00:01:500]在1.5秒时显示的歌词


其它标签
[ar:歌手名]
[ti:歌曲名]
[al:专辑名]
[by:编辑者(指lrc歌词的制作人)]

3、编写一个简单的歌词文件

新建一个 LRC 结尾的文件,以文本形式打开

[ar:歌手名]
[ti:歌曲名]
[al:专辑名]
[by:编辑者(指lrc歌词的制作人)]

[00:01.500]歌词1
[00:02.500]歌词2
[00:03.500]歌词3
[00:04.500]歌词4
[00:05.500]歌词5

4、绑定歌词

打开 QQ 音乐电脑版,播放一首歌,打开歌词

然后右键歌词,选择 歌词 -> 关联本地歌词,选择你编辑的歌词文件,即可完成歌词的关联

以上是关于java解析lrc文件代码的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动上下拖动缩放歌词的功能

js怎么调用LRC歌词文件,在线等

lrc是啥文件?

歌词解析总结

LRC格式是啥

lrc是啥文件 lrc文件怎么打开