读取mp3文件头,大家帮忙测试。附上主要参考资料:
MP3 的头信息 ID3
保存为vbs文件,然后把 mp3文件拖上去就行了,或者直接双击打开再选择文件。
p.s:主要是想到以前有个帖子问如何从cmd下读取mp3标题,然后用读到的标题改mp3的文件名,记得当时没有人给出答案,现在终于可以用cmd+vbs而不用第三方东东来解决了。
MP3 的头信息 ID3
On Error Resume Next
strFile = GetFileName()
If Len(Trim(strFile)) = 0 Then WScript.Quit
PrintInfo(strFile)
'**********************************************************************************
'处理mp3
'**********************************************************************************
Sub PrintInfo(strFile)
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objStream = CreateObject("ADODB.Stream")
objStream.Type = 1
objStream.Open
objStream.LoadFromFile strFile
objStream.position = 0
If Not Ucase(GetStr(objStream.Read(3))) = "ID3" Then
WScript.Echo "该文件不是id3格式!"
WScript.Quit
End If
objStream.position = 6
binTotalLen = objStream.Read(4)
'总长度
' intTotalLen = Ascb(Midb(binTotalLen,1,1)) * 2097152 + _
' Ascb(Midb(binTotalLen,2,1)) * 1024 + _
' Ascb(Midb(binTotalLen,3,1)) * 128 + _
' Ascb(Midb(binTotalLen,4,1))
Do
strFrameID = GetStr(objStream.Read(4))
If Len(Trim(strFrameID)) = 0 Then Exit Do
binSize = objStream.Read(4)
intSize = Ascb(Midb(binSize,1,1)) * 4294967296 + _
Ascb(Midb(binSize,2,1)) * 65536 + _
Ascb(Midb(binSize,3,1)) * 256 + _
Ascb(Midb(binSize,4,1))
objStream.Read(2)
i = 0
While Ascb(objStream.Read(1)) = 0
i = i + 1
If intSize - i < 1 Then Exit Do
Wend
objStream.Position = objStream.Position - i
objDictionary.Add strFrameID,GetStr(objStream.Read(intSize - i))
Loop
For Each i In objDictionary.Keys
str2 = objDictionary.Item(i)
Select Case UCase(i)
Case "TIT2"
str1 = "标题"
Case "TPE1"
str1 = "作者"
Case "TALB"
str1 = "专集"
Case "TRCK"
str1 = "音轨"
Case "年代"
str1 = "年代"
Case "TCON"
str1 = "类型"
Case "COMM"
str1 = "备注"
str2 = Trim(Mid(str2,4)) '前4个字符为语言代码(3)+空格(1).chi为中文,eng为自然语言
Case Else
str1 = UCase(i)
End Select
str3 = str3 & str1 & vbTab & str2 & vbLf
Next
WScript.Echo str3
Set objDictionary = Nothing
Set objStream = Nothing
End Sub
'**********************************************************************************
'2进制转换为字符串
'**********************************************************************************
Function GetStr(Bin)
For I = 1 To LenB(Bin)
clow=MidB(Bin,I,1)
If ASCB(clow)<128 Then
If AscB(clow) = 0 Then
Str = Str & Space(1)
Else
Str = Str & Chr(ASCB(clow))
End If
Else
I=I+1
If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
End If
Next
GetStr = Str
End Function
'**********************************************************************************
'获得文件名
'**********************************************************************************
Function GetFileName()
If WScript.Arguments.Count < 1 Then
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = "Mp3 File|*.mp3|All Files|*.*"
objDialog.InitialDir = ""
objDialog.ShowOpen
GetFileName = objDialog.FileName
Set objDialog = Nothing
Else
GetFileName = WScript.Arguments(0)
End If
End Function
保存为vbs文件,然后把 mp3文件拖上去就行了,或者直接双击打开再选择文件。
p.s:主要是想到以前有个帖子问如何从cmd下读取mp3标题,然后用读到的标题改mp3的文件名,记得当时没有人给出答案,现在终于可以用cmd+vbs而不用第三方东东来解决了。
