標籤:sub 檔案路徑 family odi read 位元組 維數 擷取 dia
上周我們進行了結業項目答辯,是播放器項目。有一個關於播放器變唱歌邊載入歌詞的方法特別有意思,像酷狗那樣子歌詞和歌曲同步滾播的樣子。
這裡的工具是Visual Studio 2013,使用語言是C#和.net技術。
首先我們使用File.Exists(@"檔案路徑")判斷lrc歌詞檔案是否存在,如果存在的話讀取lrc檔案。
這裡可以用Regex,也可以用一個二維數組或兩個數組。本文是用的二維數組。
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 try11 {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 //else49 //{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.大家有好的建議歡迎提出:)
C#winfrom播放器動態載入歌詞