java解析lrc文件代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解析lrc文件代码相关的知识,希望对你有一定的参考价值。
如题 有没有这方面的java代码
给我瞧瞧 谢谢了
我最近在做这个解析器
打算做一个音乐 播放器
想看看别人怎么做的
只是看看别人怎么进行解析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歌词并同步滚动上下拖动缩放歌词的功能