Ⅰ 怎樣用VB實現LRC歌詞播放
【編程原理】
要實現歌詞與音頻同步顯示並讓音頻文件自動播放,我們首先要從網上下載音頻文件(本文以MP3為例)和歌詞文件(LRC格式),然後用VB製作一個簡易的音頻播放器,實現音頻與歌詞的同步播放,最後用WinRar或VB-PowerWrap工具實現音頻文件與歌詞的封裝並自動播放。
【編程分析】
一、歌詞同步原理
千千靜聽的歌詞文件擴展名為LRC,歌詞是以句為單位進行顯示,歌詞文件中包含了歌詞內容及歌詞顯示時的音頻播放時間,歌詞在後,時間在前,時間放在一對中括弧內。在播放的時候,實時獲取播放位置對應的播放時間,並從歌詞文件中查找當前時刻對應的歌詞並顯示出來,這就是千千靜聽播放器的同步顯示原理。在一首歌中,重復的歌詞將對應兩個或多個音頻播放時間,如圖1所示。歌詞文件格式從本質上講是文本格式,因此,我們可以用記事本對歌詞進行編輯,如果從網上下載的歌詞文件在播放時不能與音頻同步,那麼我們可以修改其中的時間,在歌曲的前奏音樂時間內,可以加入一些信息,如:專輯名稱、詞曲作者、歌手名稱等等。
圖1 歌詞文件
二、播放功能實現
播放音頻文件的方法很多,本文採用「Microsoft MultiMedia Control」控制項(MCI32.OCX)實現,在調用Multimedia MCI控制項之前,須要執行「工程\部件」菜單命令,將「Microsoft Multimedia Controls」前的方框選中,確定返回,在工具箱中便會出現Multimedia 控制項圖標,把 Multimedia 控制項添加到窗體上,命名為Mci。
1、MCI控制項的部分方法和屬性如下:
Mci.FileName = Mp3 '文件名
Mci.Command = "Open" '打開
Mci.Command = "Play" '播放
Mci.Command = "Stop" '停止
Mci.Command = "Close" '關閉
Mci.Position:當前播放時間(毫秒)
Mci.Length:總的播放時間(毫秒)
2、取得Windows臨時文件夾
把音頻文件和歌詞文件都放在程序同文件夾中,且名稱都為Song(擴展名分別為MP3、LRC),程序運行時,將音頻文件復制到Windows的臨時文件夾中,並對其進行播放。取得Windows臨時文件夾通過API函數GetTempPath實現,編程方法和核心代碼如下:
Function WinTempDir() As String
Dim Tmp As String
Dim tP As String
Tmp = Space$(255)
Call GetTempPath(Len(Tmp), Tmp)
tP = Left(Trim$(Tmp), Len(Trim$(Tmp)) - 1)
If Right$(tP, 1) <> "\" Then
tP = tP + "\"
End If
WinTempDir = tP
End Function
3、讀入歌詞
在播放音頻文件前,將當前文件夾中的歌詞從文件中讀入到列表框控制項中,在播放的時候,可以通過播放時間提取歌詞並顯示,讀入歌詞文件的編程方法和核心代碼如下:
Function OpenLrc()
'Lrc為歌詞文件名
Open Lrc For Input As #1
While Not EOF(1)
Line Input #1, S
If Len(S) > 0 Then List1.AddItem S
Wend
Close #1
End Function
4、程序初始化
程序運行時取得當前文件夾和Windows臨時文件夾,完成音頻文件復制,讀入歌詞,同時刪除當前文件夾中的音頻文件和歌詞文件,並開始音頻播放,編程方法和核心代碼如下:
Private Sub Form_Load()
Pa = App.Path
tPa = WinTempDir
tMp3 = Pa + "Song.mp3"
Mp3 = tPa + "Song.mp3"
Lrc = Pa + "Song.lrc"
FileCopy tMp3, Mp3
Call OpenLrc '歌詞
Kill tMp3: Kill Lrc
'以上刪除了音頻文件和歌詞文件,在程序調試期間,應取消此功能
Mci.FileName = Mp3
Mci.Command = "Open"
Mci.Command = "Play"
End Sub
5、歌詞同步顯示
在音頻播放時,通過定時器控制項,獲取當前音頻播放時間(MM:SS,秒級),然後在列表框中查找當前時間對應的歌詞,找到則顯示歌詞,編程方法和核心代碼如下:
'轉換播放時間格式
Function tFormat(iPos) As String
M = iPos / 1000 \ 60 '分
S = iPos / 1000 Mod 60 '秒
If M < 10 Then Ret = "0"
Ret = Ret + CStr(M) + ":"
If S < 10 Then Ret = Ret + "0"
Ret = Ret + CStr(S)
tFormat = Ret
End Function
'查找歌詞位置
Function ListIdx(ItemTxt) As Integer
For I = 0 To List1.ListCount - 1
P = InStr(1, List1.List(I), ItemTxt)
If P > 0 Then
ListIdx = I: Exit Function
End If
Next
ListIdx = -1
End Function
'同步顯示歌詞
Private Sub Timer1_Timer()
SetFormTop Me, True '窗體置頂
Pos = tFormat(Mci.Position)
Label3.Caption = Pos
Idx = ListIdx(List1, Pos)
If Idx <> -1 Then
P = InStrRev(List1.List(Idx), "]", -1)
GeCi = Mid$(List1.List(Idx), P + 1)
If GeCi = "" Then
Label2.Caption = "Music..."
Else
Label2.Caption = GeCi
End If
End If
End Sub
6、窗體設置
本文設計的簡易播放器的窗體為對話框模式(BorderStyle=3),沒有標題欄,在任務欄上沒有顯示,而且無法移動,所以要實現無標題欄窗體的移動,且要讓窗體實時置於其它窗體之上。編程方法和核心代碼如下:
'窗體置頂
Function SetFormTop(iForm As Form, iFlag As Boolean)
If iFlag = True Then
SetWindowPos iForm.hwnd, -1, 0, 0, 0, 0, 3
Else
SetWindowPos iForm.hwnd, -2, 0, 0, 0, 0, 3
End If
End Function
'窗體移動准備
Private Sub Frame1_MouseDown(參數略)
If Button = 1 Then
mX = X: mY = Y: mV = 1
End If
End Sub
'移動窗體
Private Sub Frame1_MouseMove(參數略)
If Button = 1 And mV = 1 Then
Me.Left = Me.Left + X - mX
Me.Top = Me.Top + Y - mY
End If
End Sub
'移動結束
Private Sub Frame1_MouseUp(參數略)
mV = 0
End Sub
7、編譯運行
編譯程序、運行,可以看到音頻播放的同時,歌詞在同步顯示,如圖2所示。
圖2 程序運行
三、封裝的實現
上面已經實現了音頻文件的播放與歌詞的同步顯示,但播放的是同文件夾中的音頻文件,使用的是同文件夾中的歌詞文件,實現了千千靜聽的同步顯示播放功能。但如何將音頻文件和歌詞文件封裝成一個可執行的包呢?在可執行包運行的時候,如何自動運行包中的音頻播放器從包中讀入歌詞並播放包中的音頻文件呢?
1、用WinRAR實現
WinRAR可以實現將多個文件按自解壓方式壓縮成一個可執行的文件,而且可以設置解壓後自動運行其中的某個程序(很多安裝程序就是這樣做的),利用這個方法,我們可以把上面設計的播放器和音頻文件、歌詞文件封裝成一個可執行的包。當運行可執行包時,將自動釋放包中的播放器、音頻文件、歌詞文件,並自動運行播放器開始播放。但這樣有三個缺點:一是解壓後可以看見音頻文件和歌詞文件,二是程序中使用的MCI播放控制項無法自動注冊,三是WinRar製作的壓縮包在解壓時有提示,需要用戶進行解壓確認。
2、用VB-PowerWrap實現
VB-PowerWrap是發布VB程序的一個優秀的安裝程序製作工具,她通過掃描一個VB的工程文件,自動將該工程所需要的文件加入到包中,同時可以添加其它任何類型的文件到包中,並創建一個包含所有必要文件和相關文件的可執行包供程序員發布。VB-PowerWrap使用了超強的壓縮模塊,能對所用的動態庫文件進行壓縮,這樣可以創建出最小的EXE文件。該軟體可以用於VB4、5、6版本中。
用VB-PowerWrap封裝的可執行包運行時,首先釋放出其中的所有文件,並自動將VB運行庫和第三方控制項載入到內存並從磁碟刪除釋放的文件,隨後自動運行工程中的執行程序。在本文設計的播放器中,自動將音頻文件復制到臨時文件夾並對其進行播放,同時刪除了音頻文件和歌詞文件,所以,通過用VB-PowerWrap封裝的運行包運行後,在磁碟上留下的僅僅是臨時文件夾中的音頻文件,這樣,看起來就是一個可播放音樂的獨立文件在運行。用VB-PowerWrap封裝的步驟如下:
1)、安裝並運行VB-PowerWrap;
2)、點擊界面上的【VB工程】按鈕,在彈出的對話框中,點擊右上方的圖標,選擇剛編譯的執行程序文件名並打開,隨後選擇工程文件名並打開;這時可看到你編制的程序所依賴的文件列表,從左下方選擇你所使用的VB版本,然後點擊完成按鈕返回;
3)、添加音頻文件和歌詞文件
通過軟體界面上的【添加】按鈕完成音頻文件和歌詞文件的添加,如圖3所示。
圖3 程序打包
4)、創建壓縮包
在鏈接工程和添加好其它文件之後,就可以點擊軟體界面上的【創建】按鈕,幾秒鍾後就生成一個獨立的執行程序包了。到此為止,新建立的執行程序就可以在其它任何Windows平台上獨立運行了。
【編程後記】
本文建立的VB工程和程序,具有通用性,你現在要做的就是,從網上下載你喜歡的歌曲文件和歌詞文件,並以Song為文件名放到工程的同文件夾中,這個工作是很輕松的,然後通過VB-PowerWrap工具進行打包,這樣就形成了能自動播放的音頻文件。
值得一提的是,你的程序經過VB-PowerWrap的封裝,就變得相當精幹了。源碼下載http://family1.chinaok.com/down/200629/scode.rar