1. 程式人生 > >lrc歌詞檔案格式

lrc歌詞檔案格式

 

一、lrc檔案有什麼作用

lrc檔案就是一個文字檔案,用來記錄歌曲的歌詞資訊,使得播放歌曲時能夠讓歌詞與聲音同步顯示,類似於電影字幕那種效果。

心情很喪時我們會聽首歌陶冶一下情操,不知你是否注意過音樂播放軟體播放音樂時歌詞資訊,這是酷我音樂的歌詞播放介面:

 image

當前正在播放的這一句歌詞會被高亮顯示,從上面這幅圖我們能夠看出來,這個歌詞檔案至少記錄了什麼時間播放哪一句歌詞,這些資訊都是放在lrc檔案中的,一個lrc檔案的格式大致如下:

[al:本歌所在的唱片集]
[ar:演出者-歌手]
[au:歌詞作者-作曲家]
[by:此LRC檔案的建立者]
[offset:+/- 以毫秒為單位加快或延後歌詞的播放]
[re:建立此LRC檔案的播放器或編輯器]
[ti:歌詞(歌曲)的標題]
[ve:程式的版本]
[mm:ss.xx]歌詞正文
...

 

[mm:ss.xx]歌詞正文,mm表示從開始到現在的分鐘數,ss表示從開始到現在的描述,xx表示n*10毫秒,精度是10毫秒。

 

二、LRC解析器

看到這個格式這麼簡單,便嘗試寫一個簡單的格式解析器,檔案結構參考維基百科的定義。

Lrc.java:

package cc11001100.music;

import lombok.Data;

import java.util.Map;
import java.util.TreeMap;

/**
 * @author CC11001100
 */
public class Lrc {

	// 唱片集
	private String album;
	// 演唱者
	private String artist;
	// 歌詞作者
	private String author;
	// 此LRC檔案的建立者
	private String by;
	// 建立此LRC檔案的播放器或編輯器
	private String re;
	// 歌詞標題
	private String title;
	// 程式的版本
	private String ve;

	// 歌詞正文
	private Map<String, String> lyric;

	public Lrc() {
		lyric = new TreeMap<>();
	}

	public String getAlbum() {
		return album;
	}

	public void setAlbum(String album) {
		this.album = album;
	}

	public String getArtist() {
		return artist;
	}

	public void setArtist(String artist) {
		this.artist = artist;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getBy() {
		return by;
	}

	public void setBy(String by) {
		this.by = by;
	}

	public String getRe() {
		return re;
	}

	public void setRe(String re) {
		this.re = re;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getVe() {
		return ve;
	}

	public void setVe(String ve) {
		this.ve = ve;
	}

	public Map<String, String> getLyric() {
		return lyric;
	}

	public void setLyric(Map<String, String> lyric) {
		this.lyric = lyric;
	}
}

LrcParser.java:

package cc11001100.music;

import cc11001100.acl.ip.IpAcl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;

import static com.alibaba.fastjson.JSON.toJSONString;

/**
 * 用於解析LRC歌詞
 *
 * @author CC11001100
 */
public class LrcParser {

	public static Lrc parse(List<String> lineList) {
		Lrc lrc = new Lrc();
		for (String line : lineList) {
			if (StringUtils.isBlank(line)) {
				continue;
			}
			line = line.toLowerCase();
			// 唱片集
			if (line.startsWith("[al:")) {
				lrc.setAlbum(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[ar:")) {
				// 演唱者
				lrc.setArtist(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[au:")) {
				// 歌詞作者
				lrc.setAuthor(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[by:")) {
				// LRC製作者
				lrc.setBy(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[re:")) {
				// 此LRC檔案的建立者或編輯器
				lrc.setRe(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[ti:")) {
				// 歌詞標題
				lrc.setTitle(line.substring(4, line.length() - 1));
			} else if (line.startsWith("[ve:")) {
				// 程式的版本
				lrc.setVe(line.substring(4, line.length() - 1));
			}  if (line.startsWith("[ver:")) {
				// 程式的版本
				lrc.setVe(line.substring(5, line.length() - 1));
			} else {
				int delimiterIndex = line.indexOf("]");
				String time = line.substring(1, delimiterIndex);
				String lrcContent = line.substring(delimiterIndex + 1);
				lrc.getLyric().put(time, lrcContent);
			}
		}
		return lrc;
	}

	public static void main(String[] args) throws IOException {

		List<String> lineList = FileUtils.readLines(new File("H:/KwDownload/Lyric/陳鴻宇-理想三旬.lrc"), "GBK");
		Lrc lrc = parse(lineList);
		System.out.println(toJSONString(lrc, SerializerFeature.PrettyFormat));

	}

}

 

相關資料:
1. LRC格式 - 維基百科

 

.