QT实现MP3播放器的歌词同步显示(卡拉OK功能)
一、原理
mp3歌词文件是以lrc为扩展名的文件,属于纯文本格式文件,通过解析mp3纯文本格式的歌词文件(“XXX.lrc”),实现歌词的同步显示。
二、lrc文件格式介绍:
1、简介:
LRC歌词是一种包含着“[*:*]”形式的“标签(tag)”、基于纯文本的歌词专用格式。
2、标签(ID-tags)说明
标签分为“标识标签”和“时间标签”两种,下面①~⑤为“标识标签”,⑥为“时间标签”。
①[ti:曲名]
②[ar:艺人名]
③[al:专辑名]
④[by:编者(指编辑LRC歌词的人)]
⑤[offset:时间补偿值] 其单位是毫秒,正值表示整体提前,负值相反。用于总体调整显示的快慢。
⑥[分:秒.厘秒]歌词内容
中括号里边是歌曲内容显示时的开始时间,“:”前面为分钟,“:”后面为秒,其中“.”前面为秒,“.”后面为厘秒(一秒的百分之一);中括号外边是歌词内容。
3、标签举例说明如下:
[ti:孤芳自赏] //ti.=title,标题,即歌曲名(孤芳自赏)
[ar:杨小壮] //ar.=artist,艺术家,即歌手名(杨小壮)
[al:孤芳自赏] //al.=album,专辑,即歌曲被收录的专辑(孤芳自赏)
[by:路人甲] //by somebody,即LRC歌词文件的制作者(路人甲)
[offset:0] //补偿时值。500=0.5秒,正负值分别提前和延长相应的时间(其值多为500的倍数)
以下为歌曲内容:
①“时间标签”分为2部分,中括号内记录的是时间,中括号外记录的是内容。
②前面中括号内的数字为歌曲内容显示时的开始时间,精确到厘秒。
③后面中括号外是在播放器上显示的内容,可以介绍歌曲的名称、演唱者和作者等ID3信息。
④相同的歌词内容反复时可以在词句前加上其依次出现时的时间。
[00:00.26]孤芳自赏 - 杨小壮
[00:01.87]词:杨小壮
[00:02.93]曲:杨小壮
[00:03.95]编曲:张川
[00:05.02]混音:豆豆龙
[00:06.33]SP:上海耳遇科技有限公司
[00:09.16]Co. Ltd.公司:乐巢唱片
[00:11.18]OP:乐巢文化(Solo Music)
[00:12.94]工作室:创意音工坊
[00:53.61]一个人的房间
[00:56.54]漆黑的夜晚
说明:
在歌曲播放到0.26秒的时候,显示“孤芳自赏 - 杨小壮”
在歌曲播放到1.87秒的时候,显示“词:杨小壮”
在歌曲播放到53.61秒的时候,显示第1行歌词,内容为“一个人的房间”
在歌曲播放到56.54秒的时候,显示第2行歌词,内容为“漆黑的夜晚”
三、实现方法/步骤:
1、利用QT的文件操作函数(QFile),可以取得“.lrc”文本文件的每一行数据。
2、“标识标签”的前几个字符都有特殊的含义,例如“ar”表示艺术家,通过解析这几个字符,可以取得相关的内容,可以根据具体的功能需求,决定是否对其进行解析与利用。
3、获得播放器当前正在播放的mp3歌曲的总时间和当前播放时间,这个在别的文档中已经说明。
4、通过对“时间标签”的解析,可以识别出当前歌词的内容以及当前内容播放时候的播放时间。
5、当“时间标签”中的时间与mp3的当前播放时间一直的时候,就显示该歌词的内容。
6、已经播放过的内容要保留,未播放的内容要在当前播放内容的下面显示,做成滚动播放的效果。
7、可以实现卡拉OK功能。
注意:lrc文件解析出来的时间是精确到0.01秒的,而我们的播放器时间可能是精确到0.1秒,另外由于数据发送会有延迟,实际上无法保证“时间标签”中的时间与mp3的当前播放时间完全相等,会存在0.1~0.2秒左右的偏差,因此在编码的时候要做特殊处理。
四、知识点:
ID3
一般是位于一个mp3文件的开头或末尾的若干字节内,附加了关于该mp3的歌手,标题,专辑名称,年代,风格等信息,该信息就被称为ID3信息,ID3信息分为两个版本,v1和v2版。 其中:v1版的ID3在mp3文件的末尾128字节,以TAG三个字符开头,后面跟上歌曲信息。 v2版一般位于mp3的开头,可以存储歌词,该专辑的图片等大容量的信息。
五、参考资料:
LRC 歌词文件格式:https://baike.baidu.com/item/lrc/46935?fr=aladdin