首页 > 其他分享 >音乐播放器实现歌词同步

音乐播放器实现歌词同步

时间:2023-07-31 22:07:50浏览次数:36  
标签:播放器 同步 songWord String songTime 歌词 substring int line


项目中音乐播放器实现歌词同步思路:
1.读取LRC歌词文件信息
2.将歌词时间段和对应时间段歌词保存至两个数组中,
3.按时间顺序对两个数组进行排序
核心代码如下:

public class SongWord{
public String[] time;
public String[] songWord;
  
  public long[] songTime;private UIController m_uicontroller;
private static SongWord SONGPLAYER = null;
  
  private Displayable dis;
  
  public Displayable getDis() {
   return dis;
  }public void setDis(Displayable dis) {
   this.dis = dis;
  }public static SongWord getInstance(UIController uicontroller) {
   if (SONGPLAYER == null) {
    SONGPLAYER = new SongWord(uicontroller);
   }
   return SONGPLAYER;
  }private SongWord(UIController uicontroller) {
   this.m_uicontroller = uicontroller;
  }public void readFiles(String url) {
 String musicUrl = url;
   String temp = musicUrl.substring(0, musicUrl.length() - 3);
   String fileUrl = temp + "lrc"; Vector vc = new Vector();
   try {
    FileConnection fc = (FileConnection) Connector.open("file://"
      + fileUrl);
    InputStream in = fc.openInputStream();  StringBuffer buffer = new StringBuffer();
  int ch;
    while ((ch = in.read()) != -1) {
     if (ch != '\n') {// && ch != '\r'
      buffer.append((char) ch);
     } else {
      String line = new String(buffer.toString().getBytes(),"gbk");    if (line.charAt(0) == '[' && line.charAt(1) == '0') {
       vc.addElement(line);
      }
      buffer = new StringBuffer();
     }
    }
    
   } catch (Exception e) {
    m_uicontroller.setCurrent(
      new MessageAlert("警告", "读文件出错!", dis,m_uicontroller));e.printStackTrace();
   } outputVector(vc);
  }public void outputVector(Vector vc) {
 int length = 0;
   for (int i = 0; i < vc.size(); i++) {
    String line = (String) vc.elementAt(i);
    int count = getCount(line);
    length = length + count;
   } songWord = new String[length];
   songTime = new long[length]; int k = 0;
   for (int i = 0; i < vc.size(); i++) {
    String line = (String) vc.elementAt(i);
    int count = getCount(line);
    if (count == 1) {
     songTime[k] = getTime(line.substring(1, 9));
     songWord[k] = line.substring(10);
    } else if (count == 2) {
     songTime[k] = getTime(line.substring(1, 9));
     songWord[k] = line.substring(20);
     k = k + 1;
     songTime[k] = getTime(line.substring(11, 19));
     songWord[k] = line.substring(20);
    } else if (count == 3) {
     songTime[k] = getTime(line.substring(1, 9));
     songWord[k] = line.substring(30);
     k = k + 1;
     songTime[k] = getTime(line.substring(11, 19));
     songWord[k] = line.substring(30);
     k = k + 1;
     songTime[k] = getTime(line.substring(21, 29));
     songWord[k] = line.substring(30);
    } else if (count == 4) {
     songTime[k] = getTime(line.substring(1, 9));
     songWord[k] = line.substring(40);
     k = k + 1;
     songTime[k] = getTime(line.substring(11, 19));
     songWord[k] = line.substring(40);
     k = k + 1;
     songTime[k] = getTime(line.substring(21, 29));
     songWord[k] = line.substring(40);
     k = k + 1;
     songTime[k] = getTime(line.substring(31, 39));
     songWord[k] = line.substring(40);
    }
    k++;
   } //putInfo(songTime, songWord);
 // 排序
   sort(songTime, songWord);
   
   //putInfo(songTime, songWord);}
public void putInfo(long[] songTime,String[] songWorld) {
   for (int i = 0; i < songTime.length; i++) {
    System.out.println("songTime[" + i + "]" + songTime[i]);
    System.out.println("songWord[" + i + "]" + songWord[i]);
   }
  }// 排序
  public void sort(long[] values, String[] songWord) {
   long temp;
   String tempWord;
   for (int i = 0; i < values.length; ++i) {
    for (int j = 0; j < values.length - i - 1; ++j) {
     if (values[j] > values[j + 1]) {
      temp = values[j];
      tempWord = songWord[j];
      values[j] = values[j + 1];
      songWord[j] = songWord[j + 1];
      values[j + 1] = temp;
      songWord[j + 1] = tempWord;
     }
    }
   }
  }// 将时间转化为微秒作为数组返回
  public long getTime(String line) {
   String m = line.substring(0, 2);
   String s = line.substring(3, 5); long secTime = Integer.parseInt(m) * 60 + Integer.parseInt(s);
   long nTime = secTime * 1000000;
   return nTime;
  }public int getCount(String line) {
   int count = 0;
   int length = line.length();
   for (int i = 0; i < length; i++) {
    if (line.charAt(i) == '[') {
     count++;
    }
   }
   return count;
  }
 }

标签:播放器,同步,songWord,String,songTime,歌词,substring,int,line
From: https://blog.51cto.com/u_3124497/6913696

相关文章

  • j2me在线音乐播放器技术分析
    j2me在线音乐播放器技术分析1.在线音乐播放器:音乐资源存储在服务器端,手机客户端通过无线网络读取服务器端音乐资源进行播放,播放器具有播放、暂停、快进、快退、循环播放、显示播放进度、时间等功能.2.技术实现由于j2me占时不支持边播放边下载音乐资源功能,所以需采用另一种方式实......
  • Java面试题 P19:Redis篇:Redis做为缓存,mysql的数据如何与redis进行同步呢(双写一致)
    双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。     共享锁:读锁代码 排他锁,写数据。读锁和写锁的值要一致。   MQ异步消息通知:    ......
  • rsync 远程同步
    目录一、rsync同步简介二、rsync同步1.同步方式2.备份的方式三、rsync常用命令四、配置源的两种表达方法1.格式一2.格式二五、配置rsync下行同步(定时同步)1.环境2.配置rsync源服务器3.发送端4.检测六、rsync实时同步(上行同步)1.定期同步的不足2.实时同步的优点3.......
  • rsync 远程同步
    rsync远程同步可以完成数据的备份,确保数据的安全性,而且是增量备份,减少数据的存储大小。rsync是一个快速和非常方便的文件复制工具。他能本地复制,远程复制,或者远程守护进程方式复制。  目录一、rsync概述二、rsync作用三、rsync应用场景四、rsync命令五、搭建rsync六、......
  • Flutter 3.0+ 利用VLC播放器使用rtsp协议,本地测试和打包压缩
    Flutter中使用rtsp协议在Flutter中可以集成VLC播放器通过rtsp协议连接到监控相机来实现远程监控,当然也可以用来做直播APP。使用flutter_vlc_player库扩展包地址点我跳转。首先在pubspec.yaml中添加库引用:dependencies:flutter_vlc_player:^7.2.0安卓端配......
  • 在 SQL Server Always On 可用性组中的可用性副本之间同步登录
    介绍SQLServerAlwaysOn可用性组为SQL数据库提供高可用性和灾难恢复解决方案。如果主副本出现任何问题,它会自动对辅助副本上的AG数据库进行故障转移。只要我们利用侦听器,您的应用程序就不需要对连接字符串进行任何更改。但是,在SQLAlwaysOn中,同步可用性组的各个数据库......
  • AJAX--关于什么情况下使用同步或异步
    一、什么是异步?什么是同步1.ajax请求1和ajax请求2,同步并发,就是异步2.ajax请求1和ajax请求2,只要发生等待就是同步二、异步或者同步代码上的实现xhr1.open("请求方式","url",false)第三个参数为false时,表示ajax请求1不支持异步,也就是说在ajax请求1发送之后,会影响其他ajax请......
  • m基于双PN序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果本系统进行Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:2.算法涉及理论知识概要基于双PN序列的数据帧检测和帧同步是一种在通信系统中常用的技术,用于确保接收端正确地识别和解析传输的数据帧。在本文中,我将详细介绍基于双PN序列的数据帧检测的数学原理和......
  • m基于UW序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,仿真结果如下所示:2.算法涉及理论知识概要UW序列是一种特殊类型的伪随机二进制序列,通常用于数据帧检测和帧同步。UW序列具有以下特性:平衡性:UW序列中的1和0的数量大致相等,确保序列具有良好的自相关性。低互相关:不同UW序列之间......
  • m基于双PN序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果 本系统进行Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:   2.算法涉及理论知识概要       基于双PN序列的数据帧检测和帧同步是一种在通信系统中常用的技术,用于确保接收端正确地识别和解析传输的数据帧。在本文中,我将详细介绍基于双PN......