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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM