VB2005使用类实现LRC歌词同步

VB2005使用类实现LRC歌词同步

音乐是每天必不可缺的元素,音乐播放软件更是如雨后春笋般越来越多。经典的千千静听,酷酷的酷我音乐盒,想必是爱音乐的人们离不开的软件!这些软件都有一个经典的功能——歌词同步,想不想给自己做的播放器也加上这个功能呢?Follow me
为了实现歌词同步,有必要熟悉歌词文件的工作机制:

现在主流的歌词文件为lrc格式。可以用记事本打开!它有三部分组成,分别是:信息,时间标签与歌词,如下面这段:

[ti:
七里香
]
[ar:
周杰伦
]
[al:
七里香
]
[by:
汐木
]
[00:27.68]
窗外的麻雀

[00:30.63]
在电线杆上多嘴

[00:34.24]
你说这一句

[00:37.29]
很有夏天的感觉

[00:40.99]
手中的铅笔

[00:44.09]
在纸上来来回回

[00:47.28]
我用几行字形容你是我的谁

[00:54.06]
秋刀鱼 的滋味

[00:57.44]
猫跟你 都想了解

[01:01.21]
初恋的香味就这样被我们寻回

[01:07.41]
那温暖 的阳光

[01:10.41]
像刚摘的 鲜艳草莓

[01:13.86]
你说你舍不得吃掉这一种感觉

[01:20.63]
雨下整夜

[01:22.73]
我的爱溢出就像雨水

[ti:
七里香][ar:周杰伦][al:七里香][by:汐木]是信息部分,用来说明歌曲名,歌手,专辑,歌词制作人。这部分可有可无。

[00:27.68]
就是一个时间标签,而后面的自然就是歌词了!

知道了lrc文件的结构,不难想象其大致原理:将播放时间与时间标签对比,如果一样的话,显示该标签后的歌词。

下面我就教大家如何建立一个实现歌词同步的类。为什么要用类呢?因为它可以重复使用代码,易于调用,容易移植!

开始了~
1)打开VB2005,新建项目-选择类库

2)将class1.vb改为
lrcshow.vb
3)将Public Class Class1改为
Public Class lrcshow
4)使用Imports System.IO引用IO命名空间(这个放在所有代码的最上面)

5)下面使具体实现的代码,我做了注释,很简单!

Imports System.IO
Public Class lrcshow
'定义包含歌词的数组,这个数组中的歌词用于后台处理,不会被看到
Dim LrcList As New ArrayList
'这个数组可有可无,主要贮存去除了时间标签的歌词,便于以后扩展功能

Public ShowList As New ArrayList
'要对比的时间标签

Dim LrcTimeLabel As String
'
最终显示的歌词

Public Lrc As String
'定义OpenLrcFile函数,这个函数可以把指定的lrc打开,并将歌词存入LrcList以及 ShowList

Public Function OpenLrcFile(ByVal LrcFileName As String)
'打开lrc歌词

Dim temp_file_stream As New FileStream(LrcFileName,FileMode.Open)
Dim i As Integer
Dim a As Integer
Dim St_Reader As New StreamReader(temp_file_stream,System.Text.Encoding.Default)
'一行一行地存入数组

Do Until St_Reader.EndOfStream = True
LrcList.Add(St_Reader.ReadLine)
i = i + 1
Loop
For a = 0 To LrcList.Count - 1
ShowList.Add(Microsoft.VisualBasic.Right(LrcList(a),(Len(LrcList(a)) - LrcList(a).LastIndexOf("]") - 1)))
Next
Return (ShowList.Count)
End Function
Public Function Show(ByVal LrcTimeLabel As String)
Dim i As Integer
Dim TimeFind As String
'将指定时间标签与数组中的每一个时间标签比较
For i = 0 To LrcList.Count - 1
TimeFind = LrcList(i)
If TimeFind.IndexOf(LrcTimeLabel) <> -1 Then
'如果一致,取得该时间标签后的歌词

Lrc = Microsoft.VisualBasic.Right(LrcList(i),(Len(TimeFind) - TimeFind.LastIndexOf("]") - 1))
End If
Next
End Function
End Class
这样就完成了这个类!选择生成-生成lrcshow。这样就会生成一个lrcshow.dll的文件,位于解决方案文件夹中的debug文件夹中!如图:

下面就是对类的调用:

(1)
在需要调用该类的工程中选择:项目-添加引用-浏览 选择lrcshow.dll的路径,即可完成引用

完成后如下图:可以看lrcshow已经加入引用:


(2)
创建对象
要使用一个类必须创建相应的对象才可以!

创建对象:

Dim lrc As New lrcshow.lrcshow

载入歌词:

lrc.OpenLrcFile("E:/
多媒体/ttplayer/Lyrics/周杰伦 - 千里之外
.lrc")
同步显示:调用show后,lrc.lrc即为当前歌词

lrc.Show("
当前的播放时间
")
TextBox1.Text = lrc.Lrc

注意:"当前的播放时间"这一个参数要是string型,如"0037",这里需要你将当前播放时间做一定的处理,使其为时间标签的格式!即0000这样的!具体的格式处理方式相信做过播放器的朋友都会,此处不在赘述!

效果如下:我做的仿魅族播放器:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")