大多数歌词文件都是.lrc文件,我们看一下lrc文件里面的内容
可以看到中括号里面的就是该行歌词所对应的时间,后面则是歌词,所以提取起来还是很简单的,就是对字符串的操作而已。
代码如下:
private static Lyric parseLine(String line) {
// LRC歌词通常是这样的格式:[mm:ss]歌词内容
// 或者是 [mm:ss.ff]歌词内容
if (line.startsWith("[") && line.contains("]")) {
String[] parts = line.split("]");
String timeStr = parts[0].substring(1); // 去掉开头的[
String[] timeParts = timeStr.split(":");
int minutes = Integer.parseInt(timeParts[0]);
String[] timeParts2 = timeParts[1].split("\\.");
int seconds = Integer.parseInt(timeParts2[0]);
int milliseconds = Integer.parseInt(timeParts2[1]);
milliseconds = milliseconds % 1000;//避免有些歌词文件的毫秒太长
int time = (int) ((minutes * 60 + seconds) * 1000 + milliseconds);
String lrcText="";
if (parts.length>=2){
lrcText = parts[1].trim();
}
Lyric lrcContent = new Lyric();
lrcContent.setMinutes(minutes);
lrcContent.setSeconds((int) seconds);
lrcContent.setMilliseconds(milliseconds);
lrcContent.setTime(time);
lrcContent.setLyric(lrcText);
return lrcContent;
}
return null; // 如果行不是有效的LRC格式,返回null
}
这里我只是解析一行的而已。
这里面有一个Lyric(歌词)类
public class Lyric {
private int Time; // 时间戳
private String Lyric; // 歌词内容
private int Minutes;
private int Seconds;
private int Milliseconds;
public int getTime() {
return Time;
}
public void setTime(int time) {
Time = time;
}
public String getLyric() {
return Lyric;
}
public void setLyric(String lyric) {
Lyric = lyric;
}
public int getMinutes() {
return Minutes;
}
public void setMinutes(int minutes) {
Minutes = minutes;
}
public int getSeconds() {
return Seconds;
}
public void setSeconds(int seconds) {
Seconds = seconds;
}
public int getMilliseconds() {
return Milliseconds;
}
public void setMilliseconds(int milliseconds) {
Milliseconds = milliseconds;
}
}
这样解析后呢我们就可以得到一行歌词的成分了,因为最终我们加载lrc文件的时候是一行一行读取得,所以就可以每加载一行就解析存进集合里(arraylist,linkedList之类的)
如果有lrc文件的下载链接呢,就可以用以下代码下载并解析歌词文件啦。
import android.util.Log;
import com.example.utils.Lyric;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class LyricParser {
public LyricParser() {
}
public static void parseLrc(String lrcUrl,LyricCallback callback) {
new Thread(){
@Override
public void run() {
super.run();
InputStream is = null;
try {
URL url = new URL(lrcUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type", "text/plain");
connection.connect();
is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
List<Lyric> lrcList = new ArrayList<>();
String line;
while ((line = reader.readLine()) != null) {
// 解析每一行歌词
// Log.e("LrcParser",line);
Lyric lrcContent = parseLine(line);
if (lrcContent != null) {
lrcList.add(lrcContent);
}
}
callback.onBack(lrcList);
connection.disconnect();
} catch (IOException e) {
Log.e("LrcParser", "Error reading lrc file", e);
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
Log.e("LrcParser", "Error closing stream", e);
}
}
}
}.start();
}
private static Lyric parseLine(String line) {
// LRC歌词通常是这样的格式:[mm:ss]歌词内容
// 或者是 [mm:ss.ff]歌词内容
if (line.startsWith("[") && line.contains("]")) {
String[] parts = line.split("]");
String timeStr = parts[0].substring(1); // 去掉开头的[
String[] timeParts = timeStr.split(":");
int minutes = Integer.parseInt(timeParts[0]);
String[] timeParts2 = timeParts[1].split("\\.");
int seconds = Integer.parseInt(timeParts2[0]);
int milliseconds = Integer.parseInt(timeParts2[1]);
milliseconds = milliseconds % 1000;//避免有些歌词文件的毫秒太长
int time = (int) ((minutes * 60 + seconds) * 1000 + milliseconds);
String lrcText="";
if (parts.length>=2){
lrcText = parts[1].trim();
}
Lyric lrcContent = new Lyric();
lrcContent.setMinutes(minutes);
lrcContent.setSeconds((int) seconds);
lrcContent.setMilliseconds(milliseconds);
lrcContent.setTime(time);
lrcContent.setLyric(lrcText);
return lrcContent;
}
return null; // 如果行不是有效的LRC格式,返回null
}
public interface LyricCallback{
public abstract void onBack(List<Lyric> list);
}
}