首先,要下载对应的歌词Lrc文件。因为对应的lrc文件中有固定格式,如:[00:00.00]荷塘月色。前面是时间,可以通过字符串操作得到,进而转换为毫秒数或者其他格式。

我的想法:

1>先创建一个工具包类:


import java.awt.Color;public class LrcDao {private double time = 0.0f;private String lyric = "";/** 获取时间*/public double getTime(){return time;}/** 设置时间* tine :被设置成的时间*/public void setTime(double time){this.time = time;}/** 设置时间* time:被设置成的时间字符串,格式为毫秒数*///str[0]为分钟,str[1]为秒钟,str[2]为小数点后的数字public void setTime(String time ){String str[] = time.split(":|\\.");//this.time = Integer.parseInt(str[0])*60 + Integer.parseInt(str[1]) + Integer.parseInt(str[2])*0.01;//将这个时间化为毫秒数this.time = Integer.parseInt(str[0])*60*1000 + Integer.parseInt(str[1])*1000 + Integer.parseInt(str[2]);}/** 获取歌词*/public String getLyric(){return lyric;}public void setLyric(String lyric){this.lyric = lyric;}}

2>以上工具包类的作用是存储每一行歌词,每一行歌词创建一个以上的对象,每个对象中有两个属性:这一行显示的时间和这一行显示的字符串。

接下来就要读取Lrc文件,进而处理字符串,


import java.awt.Color;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import javax.swing.JFrame;import com.team.Music.SetSongLists;
import com.team.ui.MainUI;
import com.team.ui.MusicPlaySystem;public class LrcData extends Thread {BufferedReader bufferReader = null;public String title = "";public String artist = "";public String album = "";public String lrcMaker = "";public static long time2;public static long time1 = 0;public static JFrame jf = null;public static boolean run = true;public static boolean endLrc = false;public static LrcData lrcData = new LrcData();public FileInputStream file = null;public static long timeTemp = 0;public String lrcPathpppp = null;Vector<LrcDao> statements = new Vector<LrcDao>();/** 实例化一个歌词数据,歌词数据信息由指定的文件提供 filename :指定的歌词文件*/public void setPath(String filename) {try {// 先转化为文件流FileInputStream file = new FileInputStream(filename);// 再转化为bufferReaderbufferReader = new BufferedReader(new InputStreamReader(file, "GB2312"));// 将文件数据读入内存readData();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}private LrcData() {}public static LrcData getLrcData() {return lrcData;}public LrcData(String filename) {bufferReader = null;try {// 先转化为文件流file = new FileInputStream(filename);// 再转化为bufferReaderbufferReader = new BufferedReader(new InputStreamReader(file, "GB2312"));// 将文件数据读入内存readData();} catch (FileNotFoundException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}}public void readData() {statements.clear();String strLine = "";// 循环读入所有行try {while (null != (strLine = bufferReader.readLine())) {// 判断该行是否为空行if ("".equals(strLine.trim())) {continue;}int timeNum = 0; // 本行含时间个数String str[] = strLine.split("\\]"); // 以]分隔for (int i = 0; i < str.length; ++i) {String str2[] = str[i].split("\\["); // 以[分隔str[i] = str2[str2.length - 1];if (isTime(str[i])) {++timeNum;}}for (int i = 0; i < timeNum; ++i) // 处理歌词复用的情况{LrcDao sm = new LrcDao();sm.setTime(str[i]);if (timeNum < str.length) // 如果有歌词{sm.setLyric(str[str.length - 1]);}statements.add(sm);}}} catch (IOException e) {e.printStackTrace();}}private boolean isTime(String string) {String str[] = string.split(":|\\.");//有关split的具体用法请上百度查if (3 != str.length) {return false;}try {//确保这三段字符串都是时间,for (int i = 0; i < str.length; ++i) {Integer.parseInt(str[i]);}} catch (NumberFormatException e) {return false;}return true;}// 将读取的歌词按时间排序
//  public void sortLyric() {
//      for (int i = 0; i < statements.size() - 1; ++i) {
//          int index = i;
//          double delta = Double.MAX_VALUE;
//          boolean moveFlag = false;
//          for (int j = i + 1; j < statements.size(); ++j) {
//              double sub;
//              if (0 >= (sub = statements.get(i).getTime() - statements.get(j).getTime())) {
//                  continue;
//              }
//              moveFlag = true;
//              if (sub < delta) {
//                  delta = sub;
//                  index = j + 1;
//              }
//          }
//          if (moveFlag) {
//              statements.add(index, statements.elementAt(i));
//              statements.remove(i);
//              --i;
//          }
//      }
//  }public void printLrcDate(){time1 = System.currentTimeMillis();// System.out.println("歌曲名: "+title);// System.out.println("演唱者: "+artist);// System.out.println("专辑名: "+album);// System.out.println("歌词制作: "+lrcMaker);for (int i = 0; i < statements.size();) {time2 = System.currentTimeMillis();// System.out.println(time1);if (time2 - time1 == statements.elementAt(i).getTime()) {// if(time1 == statements.elementAt(i).getTime()){System.out.println(statements.elementAt(i).getLyric());if (i + 1 < statements.size()) {System.out.println(statements.elementAt(i + 1).getLyric());//System.out.println(time2);}++i;}// System.out.println(statements.elementAt(i).getTime());// elementAt(i)第i个元素}}
}

不出意外的话,应该可以在控制台上按照时间显示。如果要边播放音乐边显示歌词,除了要开线程外,这个时间判断也要改。因为要每时每刻获得传进来一个当前播放的时间。

第一:time1和time2不能都从系统获得当前时间,要获得音乐已播放的当前时间。

第二:在歌词的时间判断里要把判断改成时间段,而不是时间点。如:if(X == 2) 改为:

if(X >=1 && X <3),这样一个时间段,用于显示歌词。

为什么这么改? 因为有时候精度到只有一毫秒差,也是不相等的,就不会显示歌词,局限性太强。

音乐播放器的歌词同步实现相关推荐

  1. 安卓音乐播放器中歌词同步问题

    音乐文件是.lrc格式的,lrc格式的文件,是MP3播放器唯一能识别的歌词文件,在MP3播放器中可以去同步 显示歌词.它是一种包含着"[]"形式的"标签"的.基 ...

  2. android 歌词同步代码,android手机音乐播放器实现歌词同步

    最近在做一款android手机上的音乐播放器,学习到了很多东西,像是Fragment,ActionBar的使用等等,这里就先介绍一下歌词同步的实现问题. 歌词同步的实现思路很简单:获取歌词文件LRC中 ...

  3. 基于IOS音乐播放器在线歌词同步小程序系统(音乐小程序)

    目 录 目 录 1 摘 要 3 Abstract 4 1 导论 6 1.1 背景问题 6 1.2 选题意义 6 1.3 本文内容 7 2 核心功能 9 2.1 功能调研 9 2.2 可行性分析 12 ...

  4. 音乐播放器实现歌词同步

    千千静听的歌词格式如下 [04:02.54][03:33.11][02:17.15][01:29.03]等 你 爱 我 爱 我 [00:26.86]等 你 爱 我 [03:40.75][02:24.7 ...

  5. Android应用开发--MP3音乐播放器滚动歌词实现

    Android应用开发--MP3音乐播放器滚动歌词实现 2013年6月2日  简.美音乐播放器开发记录 -----前话 有网友给我博客评论说,让我借鉴好的Android代码,代码贴出来的时候最好整体先 ...

  6. Android应用开发 MP3音乐播放器滚动歌词实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Andr ...

  7. android开发歌词滑动效果_Android应用开发--MP3音乐播放器滚动歌词实现

    [android]代码库2013年6月2日 简.美音乐播放器开发记录 -----主题 这篇博客的主题是:"滚动歌词的实现" 要的效果如下: ----实现过程 1. 建立歌词内容实体 ...

  8. iOS开发手记-仿QQ音乐播放器动态歌词的实现

    最近朋友想做个音乐App,让我帮忙参考下.其中歌词动态滚动的效果,正好我之前也没做过,顺便学习一下,先来个预览效果. 实现思路 歌词常见的就是lrc歌词了,我们这里也是通过解析lrc歌词文件来获取其播 ...

  9. java歌词解析器_Java swing实现音乐播放器桌面歌词字体变色效果|chu

    最近看到某音乐播放器的桌面歌词如下图 其中字母"U"有两种颜色,突发奇想想模仿一下实现文字变色. 思路:使用两种颜色分别把字符串绘制到两个BufferedImage中,然后根据两种 ...

最新文章

  1. 公钥和私钥怎么生成_有趣图文帮你通俗易懂地理解公钥和私钥的区别以及与CA证书等概念...
  2. DOS批处理高级教程精选(七)
  3. 好的Java架构具备的5个特点
  4. 使用docker的mysql镜像
  5. .Net Core实现的文档数据库RavenDb
  6. android 对称加密和非对称加密,Android开发加密之对称与非对称加密算法使用案例.pdf...
  7. Springboot/Cloud集成Sentinel 和 入门实战
  8. 盘点数据处理工具,手把手教你做数据清洗和转换
  9. 他山之石 | 腾讯 多模态内容理解技术及应用
  10. 关于Vector,map等迭代器问题
  11. Power Query M语言日期时间函数(Date、DateTime、DateTimeZone、Duration)分类汇总,快速掌握
  12. 基于javaweb的户籍管理系统
  13. 吴恩达深度学习系列笔记
  14. 咖啡自由的六个阶段:无差别打击,你还能承受吗?
  15. oracle 审计 分区表,oracle分区表的分类及测试
  16. 用java web start来发布jbpm(三)
  17. Wayland/Weston 启动方式简介
  18. 笔记本连接html后分成两个屏,笔记本电脑关掉自带显示屏,外接两个显示器做分屏的实现方法。...
  19. 【历史上的今天】11 月 27 日:“数字女王”逝世;APL 语言发布;计算机先驱诞生日
  20. 【网页制作】注册表单页

热门文章

  1. 计算机会计中出纳的职责有哪些,作为一名学校出纳工作职责有哪些
  2. 2021第十一届中国轻工业信息化大会专访——帆软软件
  3. 企业级分布式数据库 - GaussDB介绍
  4. 海思一颗料暴涨7倍,全球芯片缺货真相:原厂38颗MCU掌控汽车产业链
  5. 职场无忧-SolidWorks 2008中文版零件+模具设计技法与典型实例
  6. 试用 wps 2012 抢先版(发个牢骚)
  7. 亚马逊 aws 指南 实战_减少您的AWS成本完整指南
  8. netbeans java web_使用Netbeans创建java Web项目
  9. 【考研经验】研究生,我,来了!
  10. 18万美元offer!ChatGPT通过谷歌L3入职测试,人类码农危?