上周我们进行了结业项目答辩,是播放器项目。有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子。
这里的工具是Visual Studio 2013,使用语言是C#和.net技术。
首先我们使用File.Exists(@"文件路径")判断lrc歌词文件是否存在,如果存在的话读取lrc文件。
这里可以用正则表达式,也可以用一个二维数组或两个数组。本文是用的二维数组。
lrc文件也是文本文件,一句歌词就是一行文本。简单点理解就像数据库中的DataReader,一次读取一行文本(记录),然后我们使用substring方法分别截取到文本内的时间和歌词,放到数组中。
文件大概就是这样子的。
我们读取到了之后,播放器有一个属性,Ctlcontrols.currentPositionString:string; 获取当前进度,返回一个字符串格式的值。如“00:23”
我们拿到这个值和“保存时间”的数组里的值进行匹配,判断media player播放的时间=此行时间,则让此行高亮。(用定时器一直刷新,保持同步)
如此,就可以达到像酷狗那样子歌词和歌曲同步滚播的样子了。
最后附上源代码
1 #region 歌词 2 string[,] lrc = new string[2, 500];//保存歌词和当前进度 3 /// <summary> 4 /// 读取并显示歌词 5 /// </summary> 6 public void ShowLrc() 7 { 8 if (this.axWindowsMediaPlayer2.playState == WMPLib.WMPPlayState.wmppsPlaying) 9 { 10 try 11 { 12 //using:作用是使用完成后自动释放内存 13 //StreamReader:作用是用特定的编码从字节流中读取字节 14 using (StreamReader sr = new StreamReader(KTVUtil.songPath + @"\" + PlayList.PlayingSongName() + ".lrc", Encoding.Default)) 15 { 16 String line; 17 //循环读取每一行歌词 18 while ((line = sr.ReadLine()) != null) 19 { 20 //将读取到的歌词存放到数组中 21 for (int i = 0; i < 500; i++) 22 { 23 if (lrc[0, i] == null) 24 { 25 lrc[0, i] = line.Substring(10, line.Length - 10); 26 break; 27 } 28 } 29 //将读取到的歌词时间存放到数组中 30 for (int i = 0; i < 500; i++) 31 { 32 if (lrc[1, i] == null) 33 { 34 lrc[1, i] = line.Substring(1, 5); 35 break; 36 } 37 } 38 } 39 /***********动态显示歌词***************/ 40 //获取播放器当前进度 41 string numss = this.axWindowsMediaPlayer2.Ctlcontrols.currentPositionString; 42 for (int i = 0; i < 500; i++) 43 { 44 if (lrc[1, i].Equals(numss)) 45 { 46 this.lblLrc.Text = lrc[0, i]; 47 } 48 //else 49 //{ 50 // this.lblLrc.Text = "************"; 51 //} 52 } 53 } 54 } 55 catch (Exception ex) 56 { 57 //MessageBox.Show("异常:" + ex.Message); 58 } 59 } 60 } 61 /// <summary> 62 /// 刷新歌词 63 /// </summary> 64 /// <param name="sender"></param> 65 /// <param name="e"></param> 66 private void timer5_Tick(object sender, EventArgs e) 67 { 68 ShowLrc(); 69 } 70 #endregion
ps.大家有好的建议欢迎提出:)
时间: 2024-10-16 06:15:23