C#winfrom播放器動態加載歌詞

上週咱們進行告終業項目答辯,是播放器項目。有一個關於播放器變唱歌邊加載歌詞的方法特別有意思,像酷狗那樣子歌詞和歌曲同步滾播的樣子。正則表達式

這裏的工具是Visual Studio 2013,使用語言是C#和.net技術。數據庫

 首先咱們使用File.Exists(@"文件路徑")判斷lrc歌詞文件是否存在,若是存在的話讀取lrc文件。數組

這裏能夠用正則表達式,也能夠用一個二維數組或兩個數組。本文是用的二維數組。工具

 lrc文件也是文本文件,一句歌詞就是一行文本。簡單點理解就像數據庫中的DataReader,一次讀取一行文本(記錄),而後咱們使用substring方法分別截取到文本內的時間和歌詞,放到數組中。this

文件大概就是這樣子的。編碼

咱們讀取到了以後,播放器有一個屬性,Ctlcontrols.currentPositionString:string; 獲取當前進度,返回一個字符串格式的值。如「00:23」spa

咱們拿到這個值和「保存時間」的數組裏的值進行匹配,判斷media player播放的時間=此行時間,則讓此行高亮。(用定時器一直刷新,保持同步).net

 

如此,就能夠達到像酷狗那樣子歌詞和歌曲同步滾播的樣子了。code

 

最後附上源代碼blog

 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.你們有好的建議歡迎提出:)

相關文章
相關標籤/搜索