关于播放器中的功能(歌词同步),急求VB.NET代码!!

2025-03-01 00:04:46
推荐回答(2个)
回答1:

思路很简单可以定义一个结构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控件返回的时间和每句歌词的时间做比较,来判断应该显示那一句。代码是很久前写的 ,那时没加注释,都是刚刚加上去的哟,你可以根据你的实际情况自己修改,有什么不懂的地方可以继续问我哈~~

回答2:

按照你的说法,应该要用到Ajax,对网页中播放器插件进行帧听,然后再对歌词部分进行处理,百度的Mp3就是这样做的。

下面就简单的说一下吧

材料:歌曲、歌曲对应的歌词(可以是XML,当然也可以是歌词专用格式lrc,随便啦,什么文件都可以)、几条简单的JS语句

处理:
1、JSP生成网页的时候,将音乐播放器插件的ID命名为WMA,当然,你可以随便命名,只是这里便于说明。
2、读取XML或LRC内容,利用Ajax加载到id为lrc的div中。
并将XML或LRC的每行的歌词存到数组testmp3中(此数组当然是二维数组,数据组分别播放时间与歌词内容)
好了,到此,准备工作就做好了,下面就是重点---歌词同步。

3、相关语句:
一、定义函数getWMAtime

二、利用Interval=setInterval("getWMAtime()",900),意思就是每隔900毫秒调用getWMAtime这个函数,并将其放入Interval中。
如果要用到“上一曲”“下一曲”,可以将其做为了一个函数,
将音乐的地址赋给WMA.URL,用WMA.controls.play();播放,用WMA.controls.stop();停止播放,用WMA.controls.pause();暂停播放。改变了音乐地址后,记得用Ajax载入新的歌词!

另:
getWMAtime函数的内容为读取当前词曲的播放时间
当前的播放时间:WMA.controls.currentPosition;
歌曲总时间:WMA.currentMedia.duration;

读取当前的时候后,与数组中时间项进行对比,相同(由于其它原因,可能会出现不相同的情况,因此则用“>=”)则用Ajax对id为lrc的div进行更改,具体怎么改那就随便你咯,一般就是改变一下指定行的颜色。

如果前当播放时间==歌曲总时间,那么就用clearInterval(Interval),停止Interval继续调用。

好了,一个简单的JS的歌词同步播放器就完工啦