千千静听的歌词格式如下

[04:02.54][03:33.11][02:17.15][01:29.03]等 你 爱 我 爱 我
[00:26.86]等 你 爱 我
[03:40.75][02:24.74][01:37.65][00:35.58]哪怕只有一次也就足够
[03:48.06][02:31.78][01:44.36]等 你 爱 我 爱 我

所有我们可以用一个矩阵来存储歌词内容

TCHAR SongOn[MAX_PATH]; //正在播放的歌曲最短路径 TCHAR Lyric[120][100]; //歌词 TCHAR LyricOn[100]; //正要显示的歌词 int LyricIndex; //正在播放的歌的序号 int Lcount; //歌词句数 int NextSSends; //下一句播放的时间 void CALLBACK on_timer(HWND hwnd,UINT uMessage,UINT iTimerID,DWORD dwTime); //歌词显示 void LyricFront(HWND hwnd); //前进或者后退改变歌词 void LyricSort(); //歌词排序 bool ShowLyrics(HWND hwnd); //处理歌词

每50毫秒我们去检查一下是否下一句歌词可以显示了

由于我们在操作中不是只一直播放下去

这样,当我们在拖动进度条或快进快退时

要让歌词从头开始检查播放到那里来了

函数实现代码

bool ShowLyrics(HWND hwnd) {//播放当前歌曲的歌词 // KillTimer(hwnd,2); ZeroMemory(Lyric,sizeof(Lyric)); FILE *fp; TCHAR LPATH[MAX_PATH]; ZeroMemory(LPATH,sizeof(LPATH)); lstrcpy(LPATH,SongOn); lstrcpy(LPATH+strlen(LPATH)-3,TEXT("lrc")); //修改后缀 fp = fopen(LPATH,"r"); if(fp==NULL)return ERROR; //没有歌词或者打不开 TCHAR LyricLine[100]; Lcount=0; while(!feof(fp)) { ZeroMemory(LyricLine,sizeof(LyricLine)); fgets(LyricLine,sizeof(LyricLine),fp); if(isdigit(LyricLine[1])&&isdigit(LyricLine[2])) {//属于歌词 int rtimes=1; memcpy(Lyric[Lcount],LyricLine,10); while(10*rtimes<strlen(LyricLine)&&LyricLine[10*rtimes]=='[') {//加时间头 memcpy(Lyric[Lcount+rtimes],LyricLine+10*rtimes,10); rtimes++; } LyricLine[strlen(LyricLine)-1]='/0'; for(int i=0;i<rtimes;i++) { lstrcpy(Lyric[Lcount+i]+10,LyricLine+10*rtimes); //MessageBox(hwnd,Lyric[Lcount+i],0,0); } Lcount+=rtimes; //LyricLine[strlen(LyricLine)-1]='/0'; //lstrcpy(Lyric[Lcount++],LyricLine); //MessageBox(hwnd,Lyric[Lcount-1],0,0); } } LyricSort(); //歌词排序 LyricIndex=0; lstrcpy(LyricOn,Lyric[LyricIndex]); int minute=(LyricOn[1]-'0')*10+LyricOn[2]-'0'; int second=(LyricOn[4]-'0')*10+LyricOn[5]-'0'; int ssecond=(LyricOn[7]-'0')*10+LyricOn[8]-'0'; NextSSends=(minute*60+second)*1000+ssecond*10; SetTimer(hwnd,2,50,on_timer); return true; } void LyricFront(HWND hwnd) {//快进或者快退改变了歌词处理 TCHAR temp[20]; TCHAR temp1[MAX_PATH]; wsprintf(temp1,"status %s position",SongOn); mciSendString(temp1,temp,sizeof(temp)/sizeof(TCHAR),NULL); LyricIndex=0; int iNextSSends=0; int iLyricIndex=0; do{//播放时间到 int minute=(Lyric[iLyricIndex][1]-'0')*10+Lyric[iLyricIndex][2]-'0'; int second=(Lyric[iLyricIndex][4]-'0')*10+Lyric[iLyricIndex][5]-'0'; int ssecond=(Lyric[iLyricIndex][7]-'0')*10+Lyric[iLyricIndex][8]-'0'; NextSSends=iNextSSends; LyricIndex=iLyricIndex; iNextSSends=(minute*60+second)*1000+ssecond*10; iLyricIndex++; }while(iNextSSends<atoi(temp)); LyricIndex--; lstrcpy(LyricOn,Lyric[LyricIndex]); //SetDlgItemText(hwnd,IDC_EDITLyrics,LyricOn+10); } void LyricSort() {//歌词按时间排序 for(int i=1;i<Lcount;i++) { for(int j=0;j<Lcount-i;j++) { int minute=(Lyric[j][1]-'0')*10+Lyric[j][2]-'0'; int second=(Lyric[j][4]-'0')*10+Lyric[j][5]-'0'; int ssecond=(Lyric[j][7]-'0')*10+Lyric[j][8]-'0'; int iNextSSends=(minute*60+second)*1000+ssecond*10; minute=(Lyric[j+1][1]-'0')*10+Lyric[j+1][2]-'0'; second=(Lyric[j+1][4]-'0')*10+Lyric[j+1][5]-'0'; ssecond=(Lyric[j+1][7]-'0')*10+Lyric[j+1][8]-'0'; int jNextSSends=(minute*60+second)*1000+ssecond*10; if(iNextSSends>jNextSSends) {//交换 TCHAR TEMP[100]; ZeroMemory(TEMP,sizeof(TEMP)); lstrcpy(TEMP,Lyric[j]); lstrcpy(Lyric[j],Lyric[j+1]); lstrcpy(Lyric[j+1],TEMP); } } } }

原理比较简单,就是字符串处理麻烦点

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

  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. 音乐播放器的歌词同步实现

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

  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. corosync+pacemaker+crmsh配置高可用集群。
  2. Python基础day05 作业解析【10道 函数作业题】
  3. javafx 界面_JavaFX的科幻用户界面第1部分
  4. 汉游天下公司的一些感悟
  5. 把计算机怎么连接手机的网络助手在哪里,手机连接电脑上网,详细教您手机如何连接电脑上网...
  6. macOS Big Sur Beta4 无法收到更新通知解决办法
  7. SQL Server高可用——日志传送(4-3)——使用
  8. dsp版win10和普通版区别_Win10和 Windows10版本区别是什么?
  9. java里readfile,readfile java例子
  10. deepin系统更新node
  11. 基于Spring Boot框架的驾校学员信息管理系统
  12. 惠普硬盘测试工具_短DST未通过,详细教您惠普笔记本如何检测硬盘
  13. 软件测试基础篇(1)
  14. Keil MDK使用第7篇---Go To Definition 和 Go To referebce的区别
  15. vscode全背景图设置技巧
  16. 【蓝桥杯】【啊哈!算法】冒泡排序
  17. Z字形变换(Java)
  18. IBM大面积辞退40岁+的员工,如何避免可怕的中年危机?
  19. 【转】Java 8新特性(四):新的时间和日期API
  20. 机器学习-监督学习及典型算法

热门文章

  1. Arch KDE Plasma 显示和字体调整
  2. [DSA] 数字血管造影系统-硬件篇
  3. 医院导航怎么做,最新超高性价比的智慧医院室内导航技术方案
  4. CentOS7 服务器挖矿病毒 删除又重新生成处理
  5. JSP自定义标签必知必会
  6. 【Flutter】从安卓与iOS包体优化到一键自动打包脚本的一条龙服务
  7. Xilinx Zynq-7000 SoC高性能处理器的按键、启动拨码开关
  8. 团队程序设计天梯赛-3.31排位赛总结
  9. GRE--VPN配置实验(ensp)
  10. 医药批发公司,连锁药店进销存、财务管理、GSP一体化软件