This works but the tracklength is a few second different to
the Winamp tracklength par example:
with this tag i get 245 seconds and Winamp have 259 seconds. Mostly Winamp have more second. HAve anyone an idea what wrong is or a code that recieves the same tracklength like in Winamp?******?????
Private Type MP3Information
ID As String 'ID
Layer As String 'Layer
Bitrate As Long 'Bitrate
SampleRate As Long 'Hz
Frames As Long 'Frame-Anzahl
Duration As Long 'Länge (in Sekunden)
End Type
Private Function GetMP3Information(ByVal MP3File As String) As MP3Information
Dim dIN As String
Dim bitrate_lookup(7, 15) As Integer
Dim bitrate_data As String
Dim actual_bitrate As Long
Dim X As Integer, Y As Integer
Dim mp3_id As Double, mp3_layer As Double, mp3_prot As Double
Dim mp3_bitrate As Double, mp3_freq As Double, mp3_pad As Double
Dim framesize As Double, total_frames As Double, track_length As Double
'Bitraten-Informationen
bitrate_data = bitrate_data & "032,032,032,032,008,008,"
bitrate_data = bitrate_data & "064,048,040,048,016,016,"
bitrate_data = bitrate_data & "096,056,048,056,024,024,"
bitrate_data = bitrate_data & "128,064,056,064,032,032,"
bitrate_data = bitrate_data & "160,080,064,080,040,040,"
bitrate_data = bitrate_data & "192,096,080,096,048,048,"
bitrate_data = bitrate_data & "224,112,096,112,056,056,"
bitrate_data = bitrate_data & "256,128,112,128,064,064,"
bitrate_data = bitrate_data & "288,160,128,144,080,080,"
bitrate_data = bitrate_data & "320,192,160,160,096,096,"
bitrate_data = bitrate_data & "352,224,192,176,112,112,"
bitrate_data = bitrate_data & "384,256,224,192,128,128,"
bitrate_data = bitrate_data & "416,320,256,224,144,144,"
bitrate_data = bitrate_data & "448,384,320,256,160,160,"
For Y = 1 To 14
For X = 7 To 5 Step -1
bitrate_lookup(X, Y) = Left(bitrate_data, 3)
bitrate_data = Right(bitrate_data, Len(bitrate_data) - 4)
Next
For X = 3 To 1 Step -1
bitrate_lookup(X, Y) = Left(bitrate_data, 3)
bitrate_data = Right(bitrate_data, Len(bitrate_data) - 4)
Next
Next
Open MP3File For Binary As #1
'4k der Datei einlesen, um einen Frameheader zu finden
dIN = Input(4096, #1)
filesize = LOF(1) 'Wird benötigt um die Tracklänge zu berechnen
Close #1
'Frame-Header beginnt mit 12 Bitsätzen
Do Until i = 4095
i = i + 1
d1 = Asc(Mid(dIN, i, 1))
d2 = Asc(Mid(dIN, i + 1, 1))
If d1 = &HFF And (d2 And &HF0) = &HF0 Then
'20 Header-Bits einlesen
temp_string = Mid(dIN, i + 1, 3)
mp3bits_string = ShiftBits(Mid(dIN, i + 1, 3))
Exit Do
End If
dSHIFT = ShiftBits(Mid(dIN, i, 3))
dd1 = Asc(Left(dSHIFT, 1))
dd2 = Asc(Right(dSHIFT, 1))
If dd1 = &HFF And (dd2 And &HF0) = &HF0 Then
'20 Header-Bits einlesen
mp3bits_string = Mid(dIN, i + 2, 3)
Exit Do
End If
Loop
'Die ersten 20 Bits sind Header-Infos für diesen Frame
'Das 1. Bit ist die ID; 0 = MPG-2, 1 = MPG-1
mp3_id = (&H80 And Asc(Left(mp3bits_string, 1))) / 128
'Die nächsten 2 Bits sind Layer
mp3_layer = (&H60 And Asc(Left(mp3bits_string, 1))) / 32
'Das nächste Bit ist Schutz
mp3_prot = &H10 And Asc(Left(mp3bits_string, 1))
'Die nächsten 4 Bits beschreiben die Bitrate
mp3_bitrate = &HF And Asc(Left(mp3bits_string, 1))
'Die nächsten 2 Bits legen die Frequenz fest
mp3_freq = &HC0 And Asc(Mid(mp3bits_string, 2, 1))
'Das nächste Bit ist Padding
mp3_pad = (&H20 And Asc(Mid(mp3bits_string, 2, 1))) / 2
actual_bitrate = 1000 * CLng((bitrate_lookup((mp3_id * 4) Or mp3_layer, mp3_bitrate)))
If mp3_id = 0 Then
GetMP3Information.ID = "MPEG-2"
Else
GetMP3Information.ID = "MPEG-1"
End If
Select Case mp3_layer
Case 1
GetMP3Information.Layer = "Layer III"
Case 2
GetMP3Information.Layer = "Layer II"
Case 3
GetMP3Information.Layer = "Layer I"
End Select
GetMP3Information.Bitrate = actual_bitrate
Select Case (mp3_id * 4) Or mp3_freq
Case 0
sample_rate = 22050
Case 1
sample_rate = 24000
Case 2
sample_rate = 16000
Case 4
sample_rate = 44100
Case 5
sample_rate = 48000
Case 6
sample_rate = 32000
End Select
GetMP3Information.SampleRate = sample_rate
'Trackdauer berechnen
framesize = ((144 * actual_bitrate) / sample_rate) + mp3_pad
total_frames = filesize / framesize
track_length = total_frames / 38.5 '38.5 Frames pro Sekunde
GetMP3Information.Frames = Int(total_frames)
GetMP3Information.Duration = Int(track_length)
End Function
Private Function ShiftBits(dIN As String) As String
Dim sd1 As Integer, sd2 As Integer, sd3 As Integer
Dim do1 As Integer, do2 As Integer
sd1 = Asc(Left(dIN, 1))
sd2 = Asc(Mid(dIN, 2, 1))
sd3 = Asc(Right(dIN, 1))
do1 = ((sd1 And &HF) * 16) Or ((sd2 And &HF0) / 16)
do2 = ((sd2 And &HF) * 16) Or ((sd3 And &HF0) / 16)
ShiftBits = Chr(do1) + Chr(do2)
End Function
Thanks
the Winamp tracklength par example:
with this tag i get 245 seconds and Winamp have 259 seconds. Mostly Winamp have more second. HAve anyone an idea what wrong is or a code that recieves the same tracklength like in Winamp?******?????
Private Type MP3Information
ID As String 'ID
Layer As String 'Layer
Bitrate As Long 'Bitrate
SampleRate As Long 'Hz
Frames As Long 'Frame-Anzahl
Duration As Long 'Länge (in Sekunden)
End Type
Private Function GetMP3Information(ByVal MP3File As String) As MP3Information
Dim dIN As String
Dim bitrate_lookup(7, 15) As Integer
Dim bitrate_data As String
Dim actual_bitrate As Long
Dim X As Integer, Y As Integer
Dim mp3_id As Double, mp3_layer As Double, mp3_prot As Double
Dim mp3_bitrate As Double, mp3_freq As Double, mp3_pad As Double
Dim framesize As Double, total_frames As Double, track_length As Double
'Bitraten-Informationen
bitrate_data = bitrate_data & "032,032,032,032,008,008,"
bitrate_data = bitrate_data & "064,048,040,048,016,016,"
bitrate_data = bitrate_data & "096,056,048,056,024,024,"
bitrate_data = bitrate_data & "128,064,056,064,032,032,"
bitrate_data = bitrate_data & "160,080,064,080,040,040,"
bitrate_data = bitrate_data & "192,096,080,096,048,048,"
bitrate_data = bitrate_data & "224,112,096,112,056,056,"
bitrate_data = bitrate_data & "256,128,112,128,064,064,"
bitrate_data = bitrate_data & "288,160,128,144,080,080,"
bitrate_data = bitrate_data & "320,192,160,160,096,096,"
bitrate_data = bitrate_data & "352,224,192,176,112,112,"
bitrate_data = bitrate_data & "384,256,224,192,128,128,"
bitrate_data = bitrate_data & "416,320,256,224,144,144,"
bitrate_data = bitrate_data & "448,384,320,256,160,160,"
For Y = 1 To 14
For X = 7 To 5 Step -1
bitrate_lookup(X, Y) = Left(bitrate_data, 3)
bitrate_data = Right(bitrate_data, Len(bitrate_data) - 4)
Next
For X = 3 To 1 Step -1
bitrate_lookup(X, Y) = Left(bitrate_data, 3)
bitrate_data = Right(bitrate_data, Len(bitrate_data) - 4)
Next
Next
Open MP3File For Binary As #1
'4k der Datei einlesen, um einen Frameheader zu finden
dIN = Input(4096, #1)
filesize = LOF(1) 'Wird benötigt um die Tracklänge zu berechnen
Close #1
'Frame-Header beginnt mit 12 Bitsätzen
Do Until i = 4095
i = i + 1
d1 = Asc(Mid(dIN, i, 1))
d2 = Asc(Mid(dIN, i + 1, 1))
If d1 = &HFF And (d2 And &HF0) = &HF0 Then
'20 Header-Bits einlesen
temp_string = Mid(dIN, i + 1, 3)
mp3bits_string = ShiftBits(Mid(dIN, i + 1, 3))
Exit Do
End If
dSHIFT = ShiftBits(Mid(dIN, i, 3))
dd1 = Asc(Left(dSHIFT, 1))
dd2 = Asc(Right(dSHIFT, 1))
If dd1 = &HFF And (dd2 And &HF0) = &HF0 Then
'20 Header-Bits einlesen
mp3bits_string = Mid(dIN, i + 2, 3)
Exit Do
End If
Loop
'Die ersten 20 Bits sind Header-Infos für diesen Frame
'Das 1. Bit ist die ID; 0 = MPG-2, 1 = MPG-1
mp3_id = (&H80 And Asc(Left(mp3bits_string, 1))) / 128
'Die nächsten 2 Bits sind Layer
mp3_layer = (&H60 And Asc(Left(mp3bits_string, 1))) / 32
'Das nächste Bit ist Schutz
mp3_prot = &H10 And Asc(Left(mp3bits_string, 1))
'Die nächsten 4 Bits beschreiben die Bitrate
mp3_bitrate = &HF And Asc(Left(mp3bits_string, 1))
'Die nächsten 2 Bits legen die Frequenz fest
mp3_freq = &HC0 And Asc(Mid(mp3bits_string, 2, 1))
'Das nächste Bit ist Padding
mp3_pad = (&H20 And Asc(Mid(mp3bits_string, 2, 1))) / 2
actual_bitrate = 1000 * CLng((bitrate_lookup((mp3_id * 4) Or mp3_layer, mp3_bitrate)))
If mp3_id = 0 Then
GetMP3Information.ID = "MPEG-2"
Else
GetMP3Information.ID = "MPEG-1"
End If
Select Case mp3_layer
Case 1
GetMP3Information.Layer = "Layer III"
Case 2
GetMP3Information.Layer = "Layer II"
Case 3
GetMP3Information.Layer = "Layer I"
End Select
GetMP3Information.Bitrate = actual_bitrate
Select Case (mp3_id * 4) Or mp3_freq
Case 0
sample_rate = 22050
Case 1
sample_rate = 24000
Case 2
sample_rate = 16000
Case 4
sample_rate = 44100
Case 5
sample_rate = 48000
Case 6
sample_rate = 32000
End Select
GetMP3Information.SampleRate = sample_rate
'Trackdauer berechnen
framesize = ((144 * actual_bitrate) / sample_rate) + mp3_pad
total_frames = filesize / framesize
track_length = total_frames / 38.5 '38.5 Frames pro Sekunde
GetMP3Information.Frames = Int(total_frames)
GetMP3Information.Duration = Int(track_length)
End Function
Private Function ShiftBits(dIN As String) As String
Dim sd1 As Integer, sd2 As Integer, sd3 As Integer
Dim do1 As Integer, do2 As Integer
sd1 = Asc(Left(dIN, 1))
sd2 = Asc(Mid(dIN, 2, 1))
sd3 = Asc(Right(dIN, 1))
do1 = ((sd1 And &HF) * 16) Or ((sd2 And &HF0) / 16)
do2 = ((sd2 And &HF) * 16) Or ((sd3 And &HF0) / 16)
ShiftBits = Chr(do1) + Chr(do2)
End Function
Thanks