浅析LRC歌词文件
[时间: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歌词的直接渲染,需要通过subtitlesfilter来实现。对应的命令行如下:
./ffplay.exe -i -vf subtitles=base/zuimei.lyric -i zuimei.mp3 -x 800 -y 600
更多详细介绍建议参考FFmpeg官方文档-subtitles filter。
4 小结
本文简单整理了LRC歌词的格式,并对音乐播放器歌词显示逻辑做了简要概述。可供后续参考。
5 参考资料
浅析LRC歌词文件的更多相关文章
- Java使用正则表达式解析LRC歌词文件
LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持. lrc歌词文本中含有两类标签: 1.标识标签(ID-tags) [ar:艺人名] [ti:曲名] [al:专辑名] [by:编者(指编辑LRC ...
- 如何将lrc歌词文件批量转换为ANSI编码?
有些MP3.MP4或学习机只能播放ANSI编码的歌词文件,可是从网站上下载的歌词大多是UTF-8或者其它机器支持不了的编码,如何批量将这些lrc歌词文件转换成ANSI编码的文件呢? 工具/原料 萍客T ...
- c#解析Lrc歌词文件
看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下, 首先来了解下Lrc文件 时间格式: 1.标准格式: [分钟:秒.毫秒] 歌词 注释:括号.冒号.点号全都要求 ...
- LRC歌词文件读取代码
/**************************************************/ /*******************-main文件-******************* ...
- 解析LRC歌词文件readlrc
package com.jikexueyuan.readlrc.main; import com.jikexueyuan.readlrc.utils.Utils; import java.io.Fil ...
- C#下载歌词文件
前段时间写了一篇c#解析Lrc歌词文件,对lrc文件进行解析,支持多个时间段合并.本文借下载歌词文件来探讨一下同步和异步方法. Lrc文件在网络上随处可见,我们可以通过一些方法获取,最简单的就是别人的 ...
- Lrc歌词-开发标准
LRC歌词是在其程序当中实现的专门用于MP3等歌词同步显示的标签式的纯文本文件,如今已经得到了广泛的运用.现就LRC歌词文件的格式规定详细说明,已供程序开发人员参考. LRC文件是纯文本文件,可以用记 ...
- 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能
前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...
- 歌词文件解析(一):LRC格式文件的解析
LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示.LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的基于纯文本的歌词专用 ...
随机推荐
- C# winform 弹出确认消息框
if (MessageBox.Show("确认删除?", "此删除不可恢复", MessageBoxButtons.YesNo) == DialogResult ...
- LOJ.6068.[2017山东一轮集训Day4]棋盘(费用流zkw)
题目链接 考虑两个\(\#\)之间产生的花费是怎样的.设这之间放了\(k\)个棋子,花费是\(\frac{k(k-1)}{2}\). 在\((r,c)\)处放棋子,行和列会同时产生花费,且花费和该行该 ...
- Python——运算符
Python算术运算符 以下假设变量: a=10,b=20: 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 ...
- make、makefile、cmake、qmake对比
作者:玟清链接:https://www.zhihu.com/question/27455963/answer/36722992来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- AVL树的理解及自写AVL树
AVL树是最先发明的自平衡二叉查找树.在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下都是O(log n).增加和删除可能需要通过一次或多 ...
- BZOJ4133 : Answer的排队
设$f[i][j]$表示考虑前$i$个人,第$i$个人在前$i$个人中排名为$j$的方案数. 对于大小关系相同的一段,转移可以看成求$k$次前/后缀和,任意一项对另一项的贡献仅和其下标差值有关,FFT ...
- fastjson 使用教程
fastjson 是阿里的开源项目,具网上的说法 fastjson 的解析速度是 Gson 的6倍,体积小,而且开源. 项目地址: https://github.com/alibaba/fastjso ...
- Wooden Sticks [POJ1065] [DP]
Description 有N根木棍等待处理.机器在处理第一根木棍时需要准备1分钟,此后遇到长宽都不大于前一根木棍的木棍就不需要时间准备,反之则需要1分钟重新准备.比如木棍按照(3,3).(1,3).( ...
- vs 基本验证控件使用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.c ...
- JS_高程5.引用类型(3)Array类型-检测数组
1. instanceof操作符(ECMAScript3) 对于一个网页,或者是一个全局作用域而言,使用instanceof操作符来检测数组就可以得到满意的结果. 语法:if(value instan ...