上週咱們進行告終業項目答辯,是播放器項目。有一個關於播放器變唱歌邊加載歌詞的方法特別有意思,像酷狗那樣子歌詞和歌曲同步滾播的樣子。正則表達式
這裏的工具是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.你們有好的建議歡迎提出:)