C#winfrom播放器动态加载歌词

上周我们进行了结业项目答辩,是播放器项目。有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子。

这里的工具是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.大家有好的建议欢迎提出:)

posted @ 2016-12-14 00:03  南橘  阅读(3227)  评论(2编辑  收藏  举报
蜘蛛