MP3制作之LRC歌词文件解析(附:源代码)

LRC 歌词同步

一、准备工作
  既然要制作歌词同步程序,首先要准备一首歌,我们就以“周杰伦-青花瓷”为例。首先要下载这首“青花瓷.mp3”,保存为“C:/My Player/Music/青花瓷.mp3”。还要下载青花瓷的 LRC 文件,大家可以到网上下载(地址见附录),将文本内容保存为“C:/My Player/LRC/青花瓷.lrc”。我们的程序(类和FLA)则保存在“C:/My Player/”文件夹下。
青花瓷.lrc 文件:
[ti:青花瓷]
[ar:周杰伦]
[al:我很忙]
[by:张琪]
[00:00.00]发送短信18到291199下载该歌曲到手机
[00:01.11]青花瓷
[03:36.49]
[00:21.39]素眉勾勒秋千话北风龙转丹 
[00:26.08]屏层鸟绘的牡丹一如你梳妆
[00:30.46]黯然腾香透过窗心事我了然 
[00:34.93]宣纸上皱边直尺各一半
[00:39.49]油色渲染侍女图因为被失藏 
[00:43.83]而你嫣然的一笑如含苞待放
[00:48.30]你的美一缕飘散 
[00:50.77]去到我去不了的地方
[02:23.97][00:55.77]
[03:01.92][02:25.63][00:56.90]天正在等烟雨 
[03:03.57][02:27.91][00:58.99]而我在等你 
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起 
[03:07.76][02:32.25][01:03.49]隔江千万里
[03:10.36][02:34.85][01:05.84]在平地书刻你房间上的飘影 
[03:14.67][02:38.73][01:09.87]就当我为遇见你伏笔
[03:18.83][02:43.35][01:14.34]天正在等烟雨 
[03:21.20][02:45.60][01:16.68]而我在等你 
[03:23.71][02:48.01][01:18.99]月色被打捞起 
[03:25.74][02:50.10][01:21.18]掩盖了结局
[03:28.33][02:52.54][01:23.72]如传世的青花瓷在独自美丽 
[03:32.30][02:56.67][01:27.65]你眼的笑意
[01:50.25]色白花青的景已跃然于碗底 
[01:54.69]临摹宋体落款时却惦记着你
[01:59.22]你隐藏在药效里一千年的秘密 
[02:03.75]急溪里犹如羞花沾落地
[02:08.32]林外芭蕉 惹咒语 
[02:10.57]梦幻的铜绿
[02:12.84]而我路过那江南小镇的等你
[02:17.19]在泼墨山水画里 
[02:19.75]你从墨色深处被隐去
  大家也可以把这个文本内容复制下来,然后在“C:/My Player/LRC/”下创建一个文本文档,将内容粘贴上去,再将文档保存为“青花瓷.lrc”,注意扩展名是“.lrc”。
Lrc歌词文件格式说明

   扩展名为Lrc格式的文件,是MP3播放器唯一能够识别的歌词文件,在MP3数码播放器或千千静听中可以区同步显示歌词。
它是一种包含着“[*:*]”形式的“标签(tag)”的、基于纯文本的歌词专用格式。
[b][color=#00CCFF]Lrc歌词文本中含有两类标签:[/color][/b]
■ 标识标签(ID-tags)
其格式为"[标识名:值]"。大小写等价。以下是预定义的标签。   
[ar:艺人名]   
[ti:曲名]   
[al:专辑名]   
[by:编者(指编辑LRC歌词的人)]   
[offset:时间补偿值] 其单位是毫秒,正值表示整体提前,负值相反。这是用于总体调整显示快慢的。
■ 时间标签(Time-tag)
    形式为"[mm:ss]"或"[mm:ss.fff]"(分钟数:秒数)。数字须为非负整数, 比如"[12:34.5]"是有效的,而"[0x0C:-34.5]"无效。
    时间标签需位于某行歌词中的句首部分,一行歌词可以包含多个时间标签(比如歌词中的迭句部分)。当歌曲播放到达某一时间点时,MP3就会寻找对应的时间标签并显示标签后面的歌词文本,这样就完成了“歌词同步”的功能。
[分钟:秒.毫秒]歌词
    例如,“[01:50.25]色白花青的景已跃然于碗底”表示在1分50.25秒时,歌词内容是“色白花青的景已跃然于碗底”。
    还有一种形式是“[03:01.92][02:25.63][00:56.90]天正在等烟雨”这种形式常用于赋格部分(俗称:歌曲的高潮部分),它表示在 03:01.92, 02:25.63, 00:56.90 时的歌词都是“天正在等烟雨”。由于这种形式的存在,使后面的编程稍显复杂,不过没关系,凭借各位的聪明智慧一定没问题。


用记事本按照上述格式写好后,将拓展名改为lrc即可做出该文件.LRC歌词是一种通过编辑器把歌词按歌曲歌词出现的时间编辑成一个文件,在播放歌曲时同步依次显示出来的一种歌词文件。把歌曲和LRC歌词命为相同的文件名放在同一目录下,用带显示歌词功能的播放器播放歌曲时歌词就可以同步显示显示,方便查看和学歌。

(供程序员阅读参考)
    以下列出了开发支持LRC格式的软件时应遵守的一些标准。无论是[color=#FF0000]否在行首[/color],[color=#FF0000]行内[/color]凡具有[color=#FF0000]“[*:*]”[/color]形式的都应认为是标签。(注意:其中的冒号并非全角字符“:”)
凡是标签都不应显示。
    凡是标签,且被冒号分隔的两部分都为[color=#FF0000]非负数[/color],则应认为是[color=#FF0000]时间标签[/color]。因此,对于非标准形式(非“[mm:ss]”)的时间标签也应能识别(如“[0:0]”)。凡是标签,且非时间标签的,应认为是标识标签。标识名中大小写等价。
•为了向后兼容,应对未定义的新标签作忽略处理。另应对注释标签([:])后的同一行内容作忽略处理。 应允许一行中存在多个标签,并能正确处理。应能正确处理未排序的标签。

实现功能 举例:
LRC 内容如下:
[00:43.83]而你嫣然的一笑如含苞待放
[00:48.30]你的美一缕飘散 
[00:50.77]去到我去不了的地方
[03:01.92][02:25.63][00:56.90]天正在等烟雨 
[03:03.57][02:27.91][00:58.99]而我在等你 
[03:05.92][02:30.44][01:00.93]炊烟袅袅升起 
[03:07.76][02:32.25][01:03.49]隔江千万里
通过字符串处理 放到二维数组或结构体中,并按照时间排序
43830 而你嫣然的一笑如含苞待放
48300 你的美一缕飘散
50770 去到我去不了的地方
56900 天正在等烟雨
58990 而我在等你
60930 炊烟袅袅升起
63490 隔江千万里
145630 天正在等烟雨
147910 而我在等你
150440 炊烟袅袅升起
152250 隔江千万里
181920 天正在等烟雨
183570 而我在等你
185920 炊烟袅袅升起
187760 隔江千万里
操作步骤如下:
1—读取声音:青花瓷.mp3
2—播放声音及获取当前播放时间(毫秒):time_ms
3—读取外部文件:青花瓷.lrc
   ——读取 LRC 文件,这一步非常简单与读取普通的文本文件是一样的;
   ——将读取的 LRC 数据按行分割( "/n" 为换行符),数组的每一个元素代表 LRC 的一行内容;
   —简单的正则表达式应用或字符串取子串操作
   —将字符串按分隔符分隔为数组
   ——在数组中提取每一行的时间及歌词,将时间字串转换为计算机可读取的时间(mm*60+ss.ff)毫秒,解决时间序列的问题;
4—.最后,随着音乐的播放,读取播放时间段内的歌词。用当前播放时间time_ms与LRCarray(数组或结构体)中的时间相比较
  如果相等就显示LRCarray中的歌词

附件:
  [url=http://download.csdn.net/source/3189841]LRC歌词读取与排序算法(C语言版)[/url]
   LRC歌词文件格式与读取C++实现(C++)
  [url=http://download.csdn.net/source/3189916]LRC文件解析详细介绍与源代码(ActionScript网页脚本[/url])

——————————————抛砖引玉——————————————————————
以上代码属于网络收集,请大家也贡献出自己的实现方法,通俗易懂的
例如 读[00:50.77]时间标签的时候可以用fscanf格式化读取函数
      fscanf(fp,“[%d:%s]”,&mm,&ss);
可以参考的函数有:
              fp = fopen("C:/My Player/LRC/青花瓷.lrc", "r") ;  //打开文件
              fgets(str, 80, fp) ;      //读取一行,放入数组str中
              ……
              ……
目的就是将文件中的字符串解析出来,请大家提点意见,最好能附上源代码和注释!!

你可能感兴趣的:(MP3制作之LRC歌词文件解析(附:源代码))