QT实现MP3播放器的歌词同步显示(卡拉OK功能)

司立果
2023-12-01

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

 类似资料: