我现在正在用VB.NET编程语言制作个简单的播放器,其中调用的就是Windows Media Player,然后现在想做这个歌词同步的功能,但是查了资料,似乎还很迷茫,不知道从何入手,因为我也是刚自学这个语言的。 其中,这个功能的话,我的想法是:它类似于千千静听的歌词同步,但不是和网络同步,而是已经把相对应歌曲的歌词内容放在一个文件夹中,然后当这歌曲一播放,这个播放器就调用这首歌曲的歌词,然后在其播放的同时显示相对应的歌词! 希望知道代码怎么写或是具体思路怎样的朋友,能给我留下言,非常感谢你们的热心帮助!!!
最新回答
蓝雨希
2024-11-25 07:41:49
思路很简单可以定义一个结构LyricStructure Lyric Dim Time As Single Dim Content As String End Structure声明一个列表 Private Lyrics As New List(Of Lyric)然后以文本方式把歌词文件读入一个变量 并对它进行分析 分别把时间和歌词内容存入一个Lyric,并加入Lyrics中。代码如下:(假设歌曲文件的路径为path)Dim LrcPath As String== IO.Path.GetDirectoryName(cPath) & "/" & IO.Path.GetFileNameWithoutExtension(cPath) & ".lrc"If IO.File.Exists(LrcPath= True Then AnalysisLyric() Private Sub AnalysisLyric() Lyrics.Clear() '先清空列表 Dim tm As Byte Dim sr As New IO.StreamReader(LrcPath, System.Text.Encoding.Default) '读取歌词文件 Do While sr.EndOfStream = False '判断是否处于文件流末尾 Dim tmpStr As String = sr.ReadLine '读取一行 If tmpStr.Length < 5 Then Continue Do '长度小于5则跳过,进行下一次循环 Select Case Mid(tmpStr, 2, 2) '判断第2-3个字符 因为歌词里的注释都是[ti:***]类似的结构 Case "ti" lTitle = Mid(tmpStr, 5, tmpStr.Length - 5) Case "ar" lArtist = Mid(tmpStr, 5, tmpStr.Length - 5) Case "al" lAlbum = Mid(tmpStr, 5, tmpStr.Length - 5) Case "by" lAuthor = Mid(tmpStr, 5, tmpStr.Length - 5) Case Else '如果不为以上的内容 则为歌词正文,进行以下操作 If Not Mid(tmpStr, 1, 6) Like "?##:##" Then Continue Do Dim time(-1) As String '因为有时歌词是以[00:00.00][00:00.00]**** 这样歌词把多个时间存放在一起的 ,所以定义一个数组来存放歌词 Do '因为不确定时间的个数,所以此处必须循环判断 tm = InStr(tmpStr, "]") '因为歌词时间有时是[00:00.00]形式,有时是[00:00]形式,所以不能单纯的截取第几个字符 ,我是根据查找']'字符来进行判断的 ReDim Preserve time(time.GetUpperBound(0) + 1) 为time数组重新分配大小 time(time.GetUpperBound(0)) = Mid(tmpStr, 1, tm) 'time.GetUpperBound(0)返回数组的第一维的最大下标 tmpStr = IIf(tmpStr.Length = tm, " ", Mid(tmpStr, tm + 1)) '歌词内容 Loop While Mid(tmpStr, 1, 6) Like "?##:##" '如果截取剩下的部分依然匹配的话继续循环 For Each t In time '为每个时间都创建一个Lyric变量 Dim ln As Lyric ln.Time = SwitchTime(Mid(t, 2, t.Length - 2)) ln.Content = tmpStr Lyrics.Add(ln) Next End Select Loop sr.Close() 关闭流 Sort() '把所有Lyric按时间顺序排序 End Sub Private Function SwitchTime(ByVal time As String) As Single ‘这个函数是用来把00:00.00格式的时间转化成以秒数显示的数值 Dim tm As Single Dim minute As Single = Val(Mid(time, 1, 2)) Dim second As Single = Val(Mid(time, 4, 5)) tm = minute * 60 + second Return tm End Function Private Sub Sort() For i = 0 To Lyrics.Count - 2 For j = i To Lyrics.Count - 1 If Lyrics(i).Time > Lyrics(j).Time Then Dim tm As Lyric = Lyrics(i) Lyrics(i) = Lyrics(j) Lyrics(j) = tm End If Next Next End Sub 接下来是显示歌词的问题了 ,只要有每句歌词和对应的时间,那么问题就好办了。你可以用Windows Media Player控件返回的时间和每句歌词的时间做比较,来判断应该显示那一句。代码是很久前写的 ,那时没加注释,都是刚刚加上去的哟,你可以根据你的实际情况自己修改,有什么不懂的地方可以继续问我哈~~