|
-
Jul 9th, 2001, 08:14 AM
#1
Thread Starter
Addicted Member
Mp3 Tag Problem
this code is for read a mp3 tag, i have a problem here:
Code:
'''start extract the first 4 bytes (32 bits) to an array
For z = 1 To 4 '
Get #1, HeadStart + z - 1, ByteArray(z)
Next z
'''stop extract the first 4 bytes (32 bits) to an array
give me a bad record error message
this is the complete syntaxis:
Code:
Type MP3Info
Bitrate As Integer
Frequency As Long
Mode As String
Emphasis As String
'ModeExtension As String
MpegVersion As Integer
MpegLayer As Integer
Padding As String
CRC As String
Duration As Long
CopyRight As String
Original As String
PrivateBit As String
HasTag As Boolean
tag As String
Songname As String
Artist As String
Album As String
Year As String
Comment As String
Genre As String
Track As String
End Type
Public GetMP3Info As MP3Info
''this function converts Binary string to decimal integer
Public Function BinToDec(BinValue As String) As Integer
BinToDec = 0
For i = 1 To Len(BinValue)
If Mid(BinValue, i, 1) = 1 Then
BinToDec = BinToDec + 2 ^ (Len(BinValue) - i)
End If
Next i
End Function
Public Function BinaryHeader(filename As String, ReadTag As Boolean, ReadHeader As Boolean) As String
Dim ByteArray(4) As Byte
FIO% = FreeFile
Open filename For Binary Access Read As FIO%
n& = LOF(FIO%): If n& < 256 Then Close FIO%: Return 'ny
If ReadHeader = False Then GoTo 5: 'if we only want to read the IDtag goto 5
Dim x As Byte
'''''start check startposition for header''''''''''''
'''''if start position <>1 then id3v2 tag exists'''''
For i = 1 To 5000 'check up to 5000 bytes for the header
Get #FIO%, i, x
If x = 255 Then 'header always start with 255 followed by 250 or 251
Get #FIO%, i + 1, x
If x > 249 And x < 252 Then
HeadStart = i 'set header start position
Exit For
End If
End If
Next i
'''end check start position for header'''''''''''''
'''start extract the first 4 bytes (32 bits) to an array
For z = 1 To 4 '
Get #1, HeadStart + z - 1, ByteArray(z)
Next z
'''stop extract the first 4 bytes (32 bits) to an array
5:
If ReadTag = False Then GoTo 10 'if we dont want to read the tag goto 10
''''start id3 tag''''''''''''''''''''''''''''''''''''''''''''''''
Dim Inbuf As String * 256
Get #FIO%, (n& - 255), Inbuf: Close FIO% 'ny
P = InStr(1, Inbuf, "tag", 1) 'ny
If P = 0 Then
With GetMP3Info
.HasTag = False
.Songname = ""
.Artist = ""
.Album = ""
.Year = ""
.Comment = ""
.Track = ""
.Genre = ""
End With
Else
With GetMP3Info
.HasTag = True
.Songname = RTrim(Mid$(Inbuf, P + 3, 30))
.Artist = RTrim(Mid$(Inbuf, P + 33, 30))
.Album = RTrim(Mid$(Inbuf, P + 63, 30))
.Year = RTrim(Mid$(Inbuf, P + 93, 4))
.Comment = RTrim(Mid$(Inbuf, P + 97, 29))
.Track = RTrim(Mid$(Inbuf, P + 126, 1))
On Error Resume Next
.Genre = Asc(RTrim(Mid$(Inbuf, P + 127, 1)))
On Error GoTo 0
End With
End If
''''stop id3 tag''''''''''''''''''''''''''''''
10:
Close FIO%
'start convert 4*1 byte array to 4*8 bits'''''
BinaryHeader = ""
For z = 1 To 4
For i = 7 To 0 Step -1
If Int(ByteArray(z) / (2 ^ i)) = 1 Then
BinaryHeader = BinaryHeader & "1"
ByteArray(z) = ByteArray(z) - (2 ^ i)
Else
If BinaryHeader <> "" Then
BinaryHeader = BinaryHeader & "0"
End If
End If
Next
Next z
'stop convert 4*1 byte array to 4*8 bits
End Function
Public Function ReadMP3(filename As String, ReadTag As Boolean, ReadHeader As Boolean) As MP3Info
bin = BinaryHeader(filename, ReadTag, ReadHeader) 'extract all 32 bits
If ReadHeader = False Then Exit Function
Version = Array(25, 0, 2, 1) 'Mpegversion table
MpegVersion = Version(BinToDec(Mid(bin, 12, 2))) 'get mpegversion from table
Layer = Array(0, 3, 2, 1) 'layer table
MpegLayer = Layer(BinToDec(Mid(bin, 14, 2))) 'get layer from table
SMode = Array("stereo", "joint stereo", "dual channel", "single channel") 'mode table
Mode = SMode(BinToDec(Mid(bin, 25, 2))) 'get mode from table
Emph = Array("no", "50/15", "reserved", "CCITT J 17") 'empasis table
Emphasis = Emph(BinToDec(Mid(bin, 31, 2))) 'get empasis from table
Dim LayerVersion As String
LayerVersion = MpegVersion & MpegLayer 'combine version and layer to string
Select Case Val(LayerVersion) 'look for the right bitrate table
Case 11 'Version 1, Layer 1
Brate = Array(0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448)
Case 12 'V1 L1
Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384)
Case 13 'V1 L3
Brate = Array(0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320)
Case 21 Or 251 'V2 L1 and 'V2.5 L1
Brate = Array(0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256)
Case 22 Or 252 Or 23 Or 253 ''V2 L2 and 'V2.5 L2 etc...
Brate = Array(0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160)
Case Else 'if variable bitrate
Bitrate = 1 'e.g. for Variable bitrate
Exit Function
End Select
Bitrate = Brate(BinToDec(Mid(bin, 17, 4)))
Select Case MpegVersion 'look for version to create right table
Case 1 'for version 1
Freq = Array(44100, 48000, 32000)
Case 2 Or 25 'for version 2 or 2.5
Freq = Array(22050, 24000, 16000)
Case Else
Frequency = 0
Exit Function
End Select
Frequency = Freq(BinToDec(Mid(bin, 21, 2))) 'look for frequency in table
NoYes = Array("no", "yes")
Original = NoYes(Mid(bin, 30, 1)) 'Set original bit
CopyRight = NoYes(Mid(bin, 29, 1)) 'Set copyright bit
Padding = NoYes(Mid(bin, 23, 1)) 'get padding bit
PrivateBit = NoYes(Mid(bin, 24, 1))
YesNo = Array("yes", "no") 'CRC table
CRC = YesNo(Mid(bin, 16, 1)) 'Get CRC
ms = (FileLen(filename) * 8) / Bitrate 'calculate duration
Duration = Int(ms / 1000)
With GetMP3Info 'set values
.Bitrate = Bitrate '
.CRC = CRC
.Duration = Duration
.Emphasis = Emphasis
.Frequency = Frequency
.Mode = Mode
.MpegLayer = MpegLayer
.MpegVersion = MpegVersion
.Padding = Padding
.Original = Original
.CopyRight = CopyRight
.PrivateBit = PrivateBit
End With
End Function
please help me!!
.Net my life; my passion, my poison, ...
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|