音乐播放器之LRC歌词解析

        音乐播放器我很早就想写一个,奈何水平不够再加上实在不是很勤奋,拖拖拉拉直到现在才去弄了下lrc歌词解析,关于歌词解析的例子网上有很多,各有各的写法,本来想随便复制一篇了事,但是又觉得不妥,最后还是老老实实去自己写解析,想解析先要了解格式,下面就开始正题。

        lrc文件通常是存放音乐歌词文件的地方,里面的格式大概分为三类,一类就是[ti:],这种一般是歌手,歌词制作人;一类则为[00:01.67],这个是时间戳,格式是mm:ss:ff,就是歌词的时间,用这个来判定什么时候显示什么歌词;最后一类就是歌词内容了,大概格式就是这样,接下来就是按照格式截取或转化数据,将其变成自己所要的数据。

      接下来直接上代码,相信程序猿看代码都会舒服一些:首先定义一个LrcRow类:

public class LrcRow implements Comparable<LrcRow> {

       public String strTime;

       public long time ;

       public String content ;

       public LrcRow ()  {

        }

        public LrcRow (String strTime , long time , String content ) {

        this.strTime = strTime;

        this.time = time;

        this.content = content;

         }

         @Override

          public String toString() {

          return "[" + strTime + "]" + content ;

          }

里面三个参数,strtime是为转换的时间,time则是用来判断显示那句歌词的时间,content就是歌词内容,只是很简单一个类。

接下来就是正式解析了,

            public staticLrcRowAnalysis_Lyrics(Stringline) {

                  intstart= line.indexOf("[");

                  intstop= line.indexOf("]");

                  if(start!= -1&&stop!= -1) {

                           LrcRow lrcrow=newLrcRow();

                           String result= line.substring(start+1,stop);

                           lrcrow.strTime=result;

                           if(!result.equals("ti:") && !result.equals("ar:") && !result.equals("al:")) {

                                     lrcrow.time=getlong(result);

                            }

                          String content= line.substring(stop+1);

                          if(content!=null&& !content.equals("")) {

                                      lrcrow.content=content;

                           }else{

                                      lrcrow.content="";

                           }

                            returnlrcrow;

                  }

                   return null;

            }

            private static long  getlong(Stringtime) {

                     String m= time.substring(0,time.indexOf(":"));

                     String s= time.substring(time.indexOf(":") +1,time.indexOf("."));

                     String ms= time.substring(time.indexOf(".") +1,time.length());

                      return Integer.valueOf(m) *60*1000//转为毫秒

                                          +Integer.valueOf(s) *1000//转为毫秒

                                          +Integer.valueOf(ms);

                }

首先,拿到一句歌词,先截取[],拿到位数,截取其中内容,当然,有可能是空字符串,于是最了-1判断,拿到[]内的内容后,如果是时间戳则调用getlong方法,将时间戳转换成毫秒值并返回出来,当然我判断是否为时间戳的条件并不是最优方案,我在这偷了懒,还要继续改,拿完时间后接下来就是歌词内容了,取歌词内容则比较容易,只要把]之后的歌词全部取出就行了,但是有些行只占时间,没有内容,也需要另加判断,毕竟歌词显示不能断,长时间不动,对用户体验也会差很多,将内容分门归类后,new一个LrcRow,将数据全部存入,将歌词按时间顺序排序,虽然文件读取有先后,但是要做好以防万一的准备,毕竟使用者可不会听你解释,排序如下:

@Override

public int compareTo(LrcRow o) {

return (int) (time- o.time);

}

以上便完成lrc歌词文件的解析,欢迎指正

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,740评论 0 33
  • 1. LRC文本解读 Android中要实现滚动歌词的第一步,是需要对LRC歌词文本进行解析,首先来看一份标准的歌...
    _柒安阅读 2,984评论 0 1
  • 该文仅对于中间这种支付方式有参考价值哟 一、开发背景 在微信公众号中,需要进行微信支付且为微信公众号网页支付。 二...
    英文名叫夏天阅读 1,795评论 0 7
  • 或是天上人挥洒出一点笔墨, 带给了人间一场大雨滂沱。 有人撑起了雨伞, 有人戴上了衣帽, 人海之中形色匆匆, 生怕...
    玄白凉阅读 464评论 0 0