|
3742668
荣誉版主
积分 2013
发帖 718
注册 2006-2-18
状态 离线
|
『楼 主』:
[原创]用vbs读取mp3文件头(暂时只能读取id3v2)
读取mp3文件头,大家帮忙测试。附上主要参考资料:
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而不用第三方东东来解决了。
|
|
2006-10-15 10:44 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
2 楼』:
我也贴一个,51js上高人给的代码
可以读取 ID-3 的 tag,支持所有 Windows Media Player 支持的格式的信息
可以修改mp3文件的 tag
Dim objArgs, iFilename, iMusicName, iMusicPtr, iSinGerName, iSpecialName, iSpecialTime, istrInfo
Set objArgs = WScript.Arguments
iFilename = objArgs(0)
Set objArgs = Nothing
iMusicName = "夜曲 - a306.com"
iMusicPtr = "a306.com"
iSinGerName = "周杰伦 - a306.com"
iSpecialName = "十一月的萧邦 - a306.com"
iSpecialTime = Now()
istrInfo = "http://www.a306.com"
Call SetWmaTag(iFilename, iMusicName, iMusicPtr, iSinGerName, iSpecialName, iSpecialTime, istrInfo)
'修改wma标签
Sub SetWmaTag(Filename, MusicName, MusicPtr, SinGerName, SpecialName, SpecialTime, strInfo)
On Error GoTo 0
Dim Player1
Set Player1 = CreateObject("WMPlayer.OCX.7")
Player1.settings.autoStart = False
Player1.settings.mute = True
Player1.Url = Filename
Player1.Controls.stop
Player1.currentMedia.setItemInfo "Title", MusicName & " " & strInfo
Player1.currentMedia.setItemInfo "Artist", SinGerName & " " & strInfo
Player1.currentMedia.setItemInfo "Album", SpecialName & " " & strInfo
Player1.currentMedia.setItemInfo "Writer", strInfo
Player1.currentMedia.setItemInfo "Composer", strInfo
Player1.currentMedia.setItemInfo "Lyrics", strInfo
Player1.currentMedia.setItemInfo "Description", strInfo
Player1.currentMedia.setItemInfo "WM/WMADRCPeakReference", strInfo
Player1.currentMedia.setItemInfo "WM/WMADRCAverageReference", strInfo
Player1.currentMedia.setItemInfo "WM/Year", SpecialTime & " " & strInfo
'Player1.currentMedia.setItemInfo "WM/PromotionURL", strInfo
Player1.currentMedia.setItemInfo "WM/Track", strInfo
'Player1.currentMedia.setItemInfo "WM/AlbumCoverURL", strInfo
Player1.currentMedia.setItemInfo "WM/Publisher", strInfo
Player1.currentMedia.setItemInfo "WM/Publisher", strInfo
Player1.currentMedia.setItemInfo "WM/ContentGroupDescription", strInfo
Player1.currentMedia.setItemInfo "WM/SubTitle", strInfo
Player1.currentMedia.setItemInfo "WM/AlbumTitle", SpecialName & " " & strInfo
Player1.currentMedia.setItemInfo "WM/OriginalAlbumTitle", strInfo
Player1.currentMedia.setItemInfo "WM/Genre", strInfo
Player1.currentMedia.setItemInfo "WM/Mood", strInfo
Player1.currentMedia.setItemInfo "WM/TrackNumber", MusicPtr
Player1.currentMedia.setItemInfo "WM/PartOfSet", SinGerName & " " & strInfo
Player1.currentMedia.setItemInfo "WM/AlbumArtist", strInfo
Player1.currentMedia.setItemInfo "WM/Conductor", strInfo
Player1.currentMedia.setItemInfo "WM/OriginalArtist", strInfo
Player1.currentMedia.setItemInfo "WM/Writer", strInfo
Player1.currentMedia.setItemInfo "WM/OriginalLyricist", strInfo
Player1.currentMedia.setItemInfo "WM/Composer", strInfo
Player1.currentMedia.setItemInfo "WM/Lyrics", strInfo
Set Player1 = Nothing
End Sub [ Last edited by electronixtar on 2006-11-27 at 02:42 AM ]
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-10-15 10:51 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
3 楼』:
发一个更猛的
http://www.visualbasicscript.com/m_25855/mpage_1/key_mp3/tm.htm
Option Explicit
'Const ForReading
Dim MyString(127)
Dim oFile
Dim sStartFolder
Dim strNewName
Dim sBuffer
Dim MPfile
Dim strArtist
Dim strSong
Dim dstFolder
Dim sBaseMP3
Dim Fso
Dim oFolder
Dim i
Dim x
Dim c
Dim title
Dim Artist
Dim Album
Dim albumyear
dim comment
Dim genre
Dim DoThing
Dim Flog
Dim retFname
Dim retFileName
Dim retFldr
Dim strTempName
Dim Count : Count = 0
Dim WshShell : set WshShell = WScript.CreateObject("WScript.Shell")
Set Fso = CreateObject("Scripting.FileSystemObject")
sBaseMP3 = "D:\testing"
sStartFolder = "D:\Testing\MP3\"
Set oFolder = Fso.GetFolder(sStartFolder)
For each oFile in oFolder.Files
If ucase(Right(oFile.name, 4)) = ".MP3" then
Call GetMP3(oFile)
Count = Count + 1
End if
Next
Msgbox Count & " " & "Files have been processed"
Sub GetMP3(string)
Dim Seperator, Songlength
DoThing = False
Set MpFile = Fso.OpenTextFile(String, 1, False, 0)
sBuffer = MpFile.ReadAll
For i = 0 To 124
MyString(i) = Chr(Asc(right(sBuffer, i + 1)))
Next
For x = 0 To 124
c = 124 - x
If c > 94 and c <= 127 Then title = title & mystring(c)
If c > 64 and c <= 94 Then artist = artist & mystring(c)
'Commented out. If you want to use the information below then
uncomment it.
' If c > 34 and c <= 64 Then album = album & mystring(c)
' If c > 30 and c <= 34 Then albumyear = albumyear & mystring(c)
' If c > 0 and c <= 30 Then comment = comment & mystring(c)
' If c = 0 then genre = mystring(c)
Next
MPFile.close
strArtist = Replace(Artist, Chr(0), "")
strArtist = Replace(strArtist,"."," ")
strArtist = Replace(strArtist,"(","")
strArtist = Replace(strArtist,")","")
strArtist = Replace(strArtist,"[","")
strArtist = Replace(strArtist,"]","")
strArtist = Replace(strArtist,"!","")
strArtist = Replace(strArtist,"/","_")
strArtist = Replace(strArtist,"\","_")
strArtist = trim(strArtist)
strSong = Replace(title, Chr(0), "")
strSong = Replace(strSong,"[","(")
strSong = Replace(strSong,"]",")")
strSong = Replace(strSong,"/","_")
strSong = Replace(strSong,"\","_")
strSong = trim(strSong)
'START POSSIBLE LOOP
retFname = Msgbox("Original name:" & vbtab & oFile.name & vbCrLf _
& "New name:" & vbtab & "[" & strArtist & " - " & strSong & ".mp3" & "]" & vbcr _
& "Artist:" & vbTab & "[" & strArtist & "]" & vbcr _
& "Song:" & vbTab & "[" & strSong & "]" & vbCr _
& vbCr & "Is the new name correct? If not click NO and" & vbCr _
& "when prompted, type in new name.", vbYesNoCancel, "Rename File")
If retFname = vbYes then
strNewName = strArtist & " - " & strSong & ".mp3"
ElseIf retFname = vbNo then
strTempName = InputBox("Type in the new name of the MP3. If the new name is not known hit enter to keep original name" _
& vbcrlf & "Old file name:" & vbTab & oFile.Name)
If strTempName = "" then
retTempFname = msgbox("You have chosen" & " " & oFile.Name & " " & "to be the name of the file. Is this correct?",vbYesNo)
If retTempFname = vbYes then
strNewName = oFile.Name
ElseIf retTempFname = vbNo then
'POSSIBLE LOOP
End if
ElseIf ucase(Right(strTempname, 4)) <> ".MP3" then
strNewName = strTempName & ".mp3"
seperator = InstrRev(strTempName,"-") 'count left to the first occurance of "-"
if (seperator >= 1) then 'if the seperator exists split into artist (folderName) and song (trackName)
strArtist = Trim(Left(strTempName,seperator - 1)) 'seperate artist
songLength= (Len(strTempName)- seperator)'work out chr length of song
strSong = Trim(right(strTempName,songLength))'seperate song
End if
msgbox "New name:" & vbTab & strNewName & vbCr _
& "Artist:" & vbTab & strArtist & vbcr _
& "Song:" & vbTab & strSong
End if
ElseIf retFname = vbCancel then
wscript.Quit
End if
'END POSSIBLE LOOP
WriteToLog("Original name" & vbtab & oFile.Name)
WriteToLog("Artist" & vbTab & vbtab & strArtist)
WriteToLog("Title" & vbTab & vbTab & strSong)
WriteToLog("New name" & vbTab & vbtab & strNewName)
WriteToLog("")
On Error Resume Next
If not Fso.FolderExists(sBaseMP3 & "\" & strArtist) then
dstFolder = Fso.CreateFolder(sBaseMP3 & "\" & strArtist)
Else
dstFolder = sBaseMP3 & "\" & strArtist
End if
'This error checking might not be needed.
If Err.Number > 0 then
Dothing = False
Msgbox err.number & vbtab & ofile.name
End if
On Error goto 0
If not Fso.FileExists(dstFolder & "\" & strNewName) Then
Fso.MoveFile oFile.Path, dstFolder & "\" & strNewName
Else
'DO SOME TYPE OF LOOP HERE. POSSIBLE SUB CALL TO RENAME FILE AS NEEDED ADDING TO THE (1).
'right now this will fail if a file is already named (1)strnewname.
Fso.MoveFile oFile.Path, dstFolder & "\" & "(1)" & strNewName
End If
'Clean up
Set MpFile = Nothing
MyString(i) = ""
sBuffer = ""
Title = ""
Artist = ""
strNewName = ""
strArtist = ""
strSong = ""
'album = ""
'albumyear = ""
'comment = ""
'genre = ""
End Sub
Sub WriteToLog(string)
If not Fso.FileExists(sStartFolder & "MP3.Log") Then
Set fLog = Fso.CreateTextFile(sStartFolder & "mp3.log", TRUE)
fLog.Close
End if
Set fLog = Fso.OpenTextFile(sStartFolder & "mp3.log", 8)
fLog.WriteLine(string)
fLog.Close
End Sub
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-27 05:10 |
|
|
ccwan
金牌会员
积分 2725
发帖 1160
注册 2006-9-23 来自 河北廊坊
状态 离线
|
『第
4 楼』:
酷啊!顶了再看!
|
三人行,必有吾师焉。 学然后知不足,教然后知困,然后能自强也。 |
|
2006-11-27 05:12 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
5 楼』:
Another one:
http://groups.google.com/group/microsoft.public.scripting.wsh/browse_thread/thread/8193e762a91edb45/e615432fab757214?q=MP3&rnum=1#e615432fab757214
思路都是一样的
const adTypeBinary = 1
const adModeReadWrite = 3
dim Stream
dim strTag, strSongName, strArtist, strAlbum, strYear, _
strComment, strGenre, strFile
'Specify the folder to iterate through, displaying all the MP3s
folder = "D:\Testing\MP3\"
'Grab the folder information
Dim FSO', Folder, File
Set FSO = CreateObject("Scripting.fileSystemObject")
Set Folder = FSO.GetFolder(folder)
set stream = createobject("adodb.stream")
Stream.Type = adTypeBinary
stream.mode = adModeReadWrite
'Loop through the files in the folder
For Each File in Folder.Files
Stream.Open
Stream.LoadFromFile File.Path
'Read the last 128 bytes
Stream.Position = Stream.size - 128
'Read the ID3 v1 tag info
strTag = ConvertBin(Stream.Read(3))
if ucase(strTag) = "TAG" then
strSongName = ConvertBin(Stream.Read(30))
strArtist = ConvertBin(Stream.Read(30))
strAlbum = ConvertBin(Stream.Read(30))
strYear = ConvertBin(Stream.Read(4))
strComment = ConvertBin(Stream.Read(30))
end if
WriteToLog("Name" & vbTab & File.Name) & vbcrlf
WriteToLog("Artist" & vbtab & StrArtist) & vbcrlf
WriteToLog("track" & vbTab & strSongName) & vbcrlf
WriteToLog("Album" & vbtab & strAlbum) & vbcrlf
WriteToLog("Year" & vbtab & strYear) & vbcrlf
WriteToLog("Comment" & vbtab & strComment) & vbcrlf
WriteToLog("") & vbcrlf
'OR
'msg = msg & "Name" & vbTab & File.Name & vbcrlf & _
' & "Artist" & vbtab & StrArtist & vbcrlf _
' & "track" & vbTab & strSongName & vbcrlf _
' & "Album" & vbtab & strAlbum & vbcrlf _
' & "Year" & vbtab & strYear & vbcrlf _
' & "Comment" & vbtab & strComment & vbcrlf _
' & ("") & vbcrlf
'OR
' msgbox "Name" & vbTab & File.Name & vbcrlf & _
' & "Artist" & vbtab & StrArtist & vbcrlf _
' & "track" & vbTab & strSongName & vbcrlf _
' & "Album" & vbtab & strAlbum & vbcrlf _
' & "Year" & vbtab & strYear & vbcrlf _
' & "Comment" & vbtab & strComment & vbcrlf _
' & ("") & vbcrlf
Stream.Close
Next
Set Stream = Nothing 'Clean up...
Msgbox "DONE"
Function ConvertBin(Binary)
'This function converts a binary byte into an ASCII byte.
for i = 1 to LenB(Binary)
strChar = chr(AscB(MidB(Binary,i,1)))
ConvertBin = ConvertBin & strChar
Next
End Function
Sub WriteToLog(string)
If not Fso.FileExists("c:\MP3.Log") Then
Set fLog = Fso.CreateTextFile("c:\mp3.log", TRUE)
fLog.Close
End if
Set fLog = Fso.OpenTextFile("c:\mp3.log", 8)
fLog.WriteLine(string)
fLog.Close
End Sub
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-27 05:14 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
6 楼』:
最 cool 的方法:(使用 shell.application,也就是资源管理器里那种)
http://groups.google.com/group/microsoft.public.scripting.wsh/browse_thread/thread/aa8884c312187845/d3d98ba2eff257fe?lnk=gst&q=MP3+shell.application&rnum=1#d3d98ba2eff257fe
var sh = new ActiveXObject("Shell.Application");
var d = sh.NameSpace(0); // Desktop-Folder
var s = 'Column-IDs for GetDetailsOf ';
s += '(Default-Folder):\r\n';
var i = -1;
while (++i<101) { /* scan cols from 0 to 100 */
var col_name = d.GetDetailsOf(null,i);
if (col_name.length)
s += '\r\n' + i + ':\t' + col_name;
}
WScript.Echo (s);
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-27 05:17 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
7 楼』:
又感觉自己的 vbs功夫不够啊,国外的牛人太多了。
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-27 05:18 |
|
|
3742668
荣誉版主
积分 2013
发帖 718
注册 2006-2-18
状态 离线
|
|
2006-11-27 13:35 |
|
|
electronixtar
铂金会员
积分 7493
发帖 2672
注册 2005-9-2
状态 离线
|
『第
9 楼』:
为了3742668,再次顶~
Quote: | 只是更改在WMPlayer播放中的信息,而不是更改文件本身的信息 |
|
看MSDN可以发现,有些属性是改 Media Player 媒体库的信息,有的是改 mp3文件本身的属性,比如说 title,我试了下,的确改的是 mp3 文件本身
|
C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>" |
|
2006-11-27 23:38 |
|
|
estar
中级用户
积分 346
发帖 103
注册 2004-4-6
状态 离线
|
『第
10 楼』:
今天又逛到这里来啦,签名闪人。
|
|
2007-4-21 08:40 |
|
|
weilong888
银牌会员
积分 1270
发帖 548
注册 2004-5-31
状态 离线
|
『第
11 楼』:
虽然不是很懂,看看还是很过瘾的。
|
|
2007-4-21 09:25 |
|
|
rockylee
新手上路
积分 3
发帖 3
注册 2006-12-28
状态 离线
|
|
2008-12-24 20:34 |
|
|