五点二十一刻钟吧 关注:2,233贴子:320
  • 6回复贴,共1

【教程】简单的LRC滚动歌词匹配技巧

只看楼主收藏回复

这方面对于播放器开发的朋友可能会有帮助吧。
另外,关于在线获取Lrc歌词的方法,可以参见这个帖子
http://tieba.baidu.com/p/4187196758?pid=79832119403&cid=0#


1楼2016-02-26 13:18回复
    所谓的Lrc歌词,就是这种 时间戳+歌词 形式的一种文本文件
    对于这种文件的解析,可以把每一行分离,当做字符串分解,截取等。变成我们需要的资源。


    2楼2016-02-26 13:25
    回复
      对了。这里先说一下,我所做的滚动歌词制作的原理是
      1:先把lrc歌词每一行 提取放进键值对 KeyValuePair<int,string> 里,int存储换算成秒的时间,string存对应时间的对应歌词;然后用泛型集合List< KeyValuePair<int,string>> 存储整首歌的所有歌词信息;

      2:把当前播放的歌的时间 换算成 秒为单位的整型数字,假设一首歌长度为4分钟,就是240秒。

      3:然后每隔一秒就检测歌词,如果符合当前时间戳内,就提取出当前时间段内的歌词进行显示。
      (当然,实际情况可能一秒不止一句歌词,所以就要减小间隔,我一般是100毫秒检测一次)


      3楼2016-02-26 13:47
      回复
        下面具体说说步骤:
        1)先把歌词文本读入到字符串数组中,这个没啥说的,有现成的方法:

        我们的目的是将每行的 时间戳和对应歌词 提取出来,以 键值对 形式储存起来
        2)通过观察,一般的LRC歌词文本是这种 一个时间戳 对应一句歌词:如

        但是,也有这种多个时间戳 对应一句歌词:如

        前者可以以 [ ] 等标记,用字符串切割方式分解,但是后者就比较麻烦了。
        所以这里采用 正则表达式进行 匹配。这样就可以用循环来解决多个时间戳的问题了。


        4楼2016-02-26 14:09
        回复
          这个是具体的提取过程:

          通过运行上面的方法,便可以得到提取过后的歌词信息:如


          5楼2016-02-26 14:41
          回复
            通过运行上面的方法,便可以得到提取过后的歌词信息:

            通过断点调试可以看到,每一句都是以KeyValuePair<int ,string> 形式储存起来了。
            但是由于存在 多个时间戳 对应 一句歌词 的情况,所以,整个List<>集合其实是无序的,所以我们还要再排个序,以便后面 调取歌词 的时候方便。
            List泛型集合也是自带排序方法的,可以直接调用Sort()方法,通过指定以键值对 KeyValuePair<int ,string> 中的int,也就是键(Key) 进行排序。

            排序过后如下:

            可以发现,经过以时间排序过后的歌词集合,已经可以正常显示了。
            至此,歌词的提取部分就完成了。


            6楼2016-02-26 14:51
            收起回复