[時間:2018-12] [狀態:Open]
[關鍵詞:字幕,LRC,歌詞,lyric,文件格式]
0 引言
幾年前(2010年左右),網絡音樂流行與免費的時代,網上有大量的mp3,使用比較常見的播放器,比如酷狗、酷我、千千靜聽等,下載mp3時總會附帶下載一個同名但以lrc為后綴的文本文件,在早幾年你可能還會遇到當時iPod的前身mp3播放器。這個lrc文件的格式就是本文的主題。
lrc是英文lyric
(歌詞)的縮寫,被用做歌詞文件的擴展名。以lrc為擴展名的歌詞文件可以在各類數碼播放器中同步顯示。大部分MP3顯示歌詞的方法使用的是lrc格式的歌詞文件,也是當前網絡上最流行的一種歌詞格式。
本文的主要內容將包括:
- LRC文件格式
- 音樂播放器之歌詞播放
- ffplay中渲染歌詞
1 LRC文件格式
LRC文件是一種基於文本的格式,和外掛的字幕流(subtitle)類似。通常有三種格式:
1.1 簡裝版
這是最常見的一種LRC格式。該格式通常顯示一整行歌詞。
LRC中有兩類元素:一種是時間標簽+歌詞,一種是ID標簽。
時間標簽的格式是[mm:ss.xx],其中mm是分鍾數,ss是秒數,xx是10ms數(注意這里都是兩位數,超出可能會被認為是格式錯誤)。
我們在很多歌詞文件中看到的格式如下:
[00:25.44]自從你離開我
[00:31.14]我不知道這些心里話還能向誰說
[00:40.12]就像是童話 王國里走來的人
[00:47.80]在我的世界 悄悄的走近又悄悄的走遠
[01:02.81]你是黑暗之中唯一的星光
ID標簽通常出現在歌詞行之前,有些播放器會忽略ID標簽,不做任何解析。通常的支持的ID如下:
[al:專輯名]
[ar:歌手名]
[au:歌詞作者-作曲家]
[by:此LRC文件的創建者]
[offset:+/- 時間補償值,以毫秒為單位,正值表示加快,負值表示延后]
[re:創建此LRC文件的播放器或編輯器]
[ti:歌詞(歌曲)的標題]
[ve:程序的版本]
舉個例子
[ti:最美的意外]
[ar:林凡]
[al:眼淚流回去]
[by:tocy]
[offset:0]
1.2 擴展簡裝版
這個版本僅在Walasoft的Walaoke(一個卡啦OK媒體播放器)上可用。此版本可使用以下標簽設置歌詞的性別:M:
男性, F:
女性, D:
合唱。
例如:
[00:12.00]只要有你
[00:17.20]F: 誰能告訴我,有沒有這樣的筆
[00:21.10]M: 如果是這樣,我可以安慰自己
[00:24.00](...背景音樂...)
[00:28.25]D: 生命中只要有你,什么都變了可以
[00:29.02]所有永恆承諾
我們假設男性為藍色,女性為紅色,合唱為粉色。 第一行使用默認色(藍色),因為沒有找到標簽。第二行歌詞以紅色開始,因為找到了F:
。 第三行歌詞以藍色開始,因為找到了M:
。 第四行歌詞以藍色開始,因為沒有找到標簽。 第五行歌詞以粉色開始,因為找到了D:
。 第六行歌詞與第五行相同,為粉色,因為沒有找到標簽。
1.3 增強版
增強LRC格式是LRC簡裝版格式的擴展,由A2 Media Player所開發。它增加了一個額外的時間標簽,格式為:<mm:ss.xx>
。用於表示一行歌詞中不同詞顯示的時間。
增強LRC格式文件的示例如下:
[mm:ss.xx] <mm:ss.xx> line 1 word 1 <mm:ss.xx> line 1 word 2 <mm:ss.xx> ... line 1 last word <mm:ss.xx>
[mm:ss.xx] <mm:ss.xx> line 2 word 1 <mm:ss.xx> line 2 word 2 <mm:ss.xx> ... line 2 last word <mm:ss.xx>
...
[mm:ss.xx] <mm:ss.xx> last line word 1 <mm:ss.xx> last line word 2 <mm:ss.xx> ... last line last word <mm:ss.xx>
2 歌詞播放簡述
在了解LRC文件格式以后,我們可以從格式描述中看出,每一行歌詞都有一個時間戳,我們可以通過這個時間戳實現與音頻文件的同步播放。
比如下面歌詞:
[00:02.05]願得一人心
[00:08.64]詞:胡小健 曲:羅俊霖
[00:11.14]演唱: 李行亮,雨宗林
[00:24.93]
[00:27.48]曾在我背包小小夾層里的那個人
[00:32.31]陪伴我漂洋過海經過每一段旅程
[00:37.38]隱形的稻草人 守護我的天真
[00:42.43]曾以為愛情能讓未來只為一個人
[00:47.50]關了燈依舊在書桌角落的那個人
[00:52.68]變成我許多年來紀念愛情的標本
[00:57.57]消失的那個人 回不去的青春
[01:02.69]忘不了愛過的人才會對過往認真
[01:09.71]只願得一人心 白首不分離
[01:14.71]這簡單的話語 需要巨大的勇氣
[01:19.73]沒想過失去你 卻是在騙自己
[01:25.34]最后你深深藏在我的歌聲里
在對應的mp3文件播放到2.05秒時需要顯示願得一人心
,這行歌詞將持續到8.64秒,然后顯示詞:胡小健 曲:羅俊霖
,這行歌詞將持續到11.14s,然后顯示演唱: 李行亮,雨宗林
,……,以此類推,直到歌曲播放完成。
上面是基本顯示邏輯,每次僅顯示一行,當然,你可以選擇實現滾屏模式,僅需要在代碼上控制下具體顯示歌詞行數及刷新時間即可。
當然實現文本渲染需要依賴於特定的平台,比如windows下的mfc控件、d3d font、directdraw Text等等。
3 ffplay中渲染歌詞
ffplay本身並不支持LRC歌詞的直接渲染,需要通過subtitles
filter來實現。對應的命令行如下:
./ffplay.exe -i -vf subtitles=base/zuimei.lyric -i zuimei.mp3 -x 800 -y 600
更多詳細介紹建議參考FFmpeg官方文檔-subtitles filter。
4 小結
本文簡單整理了LRC歌詞的格式,並對音樂播放器歌詞顯示邏輯做了簡要概述。可供后續參考。