VB Code:
Option Explicit
Public Type MP3Header
MP3Length As Long
Position As Long
Duration As Integer
ID As String
Layer As String
SampleRate As String
Mode As String
Emphasis As String
Padding As Boolean
FrameSize As Long
FrameCount As Long
CopyRighted As Boolean
Original As Boolean
BitRate As String
CRC As Boolean
End Type
Public Version As Byte
Private Sub ReadFile(strFilename As String, mHeader As MP3Header)
Static BitRate(11 To 23, 1 To 14) As String
Dim fn As Integer
Dim lngHeaderPosition As Long
Dim lngFilesize As Long
Dim BitLine As Integer
Dim i As Byte
Dim Tag2 As String
Dim TagSize As String * 4
Dim ID3Tag As String * 3
Dim sHeader As String * 4
If BitRate(11, 1) = "" Then
BitRate(11, 1) = "32"
BitRate(11, 2) = "64"
BitRate(11, 3) = "96"
BitRate(11, 4) = "128"
BitRate(11, 5) = "160"
BitRate(11, 6) = "192"
BitRate(11, 7) = "224"
BitRate(11, 8) = "256"
BitRate(11, 9) = "288"
BitRate(11, 10) = "320"
BitRate(11, 11) = "352"
BitRate(11, 12) = "384"
BitRate(11, 13) = "416"
BitRate(11, 14) = "448"
BitRate(12, 1) = "32"
BitRate(12, 2) = "48"
BitRate(12, 3) = "56"
BitRate(12, 4) = "64"
BitRate(12, 5) = "80"
BitRate(12, 6) = "96"
BitRate(12, 7) = "112"
BitRate(12, 8) = "128"
BitRate(12, 9) = "160"
BitRate(12, 10) = "192"
BitRate(12, 11) = "224"
BitRate(12, 12) = "256"
BitRate(12, 13) = "320"
BitRate(12, 14) = "384"
BitRate(13, 1) = "32"
BitRate(13, 2) = "40"
BitRate(13, 3) = "48"
BitRate(13, 4) = "56"
BitRate(13, 5) = "64"
BitRate(13, 6) = "80"
BitRate(13, 7) = "96"
BitRate(13, 8) = "112"
BitRate(13, 9) = "128"
BitRate(13, 10) = "160"
BitRate(13, 11) = "192"
BitRate(13, 12) = "224"
BitRate(13, 13) = "256"
BitRate(13, 14) = "320"
BitRate(21, 1) = "32"
BitRate(21, 2) = "64"
BitRate(21, 3) = "96"
BitRate(21, 4) = "128"
BitRate(21, 5) = "160"
BitRate(21, 6) = "192"
BitRate(21, 7) = "224"
BitRate(21, 8) = "256"
BitRate(21, 9) = "288"
BitRate(21, 10) = "320"
BitRate(21, 11) = "352"
BitRate(21, 12) = "384"
BitRate(21, 13) = "416"
BitRate(21, 14) = "448"
BitRate(22, 1) = "32"
BitRate(22, 2) = "48"
BitRate(22, 3) = "56"
BitRate(22, 4) = "64"
BitRate(22, 5) = "80"
BitRate(22, 6) = "96"
BitRate(22, 7) = "112"
BitRate(22, 8) = "128"
BitRate(22, 9) = "160"
BitRate(22, 10) = "192"
BitRate(22, 11) = "224"
BitRate(22, 12) = "256"
BitRate(22, 13) = "320"
BitRate(22, 14) = "384"
BitRate(23, 1) = "8"
BitRate(23, 2) = "16"
BitRate(23, 3) = "24"
BitRate(23, 4) = "32"
BitRate(23, 5) = "64"
BitRate(23, 6) = "80"
BitRate(23, 7) = "56"
BitRate(23, 8) = "64"
BitRate(23, 9) = "128"
BitRate(23, 10) = "160"
BitRate(23, 11) = "112"
BitRate(23, 12) = "128"
BitRate(23, 13) = "256"
BitRate(23, 14) = "320"
End If
fn = FreeFile
Open strFilename For Binary As #
lngFilesize = LOF(fn)
Get #fn, 1, ID3Tag
If ID3Tag = "ID3" Then
lngHeaderPosition = 1
Dim R As Long
Get #fn, 4, Version
Get #fn, 7, TagSize
R = CVL(TagSize, 128)
If R > lngFilesize Or R > 2147483647 Then
Exit Sub
End If
Tag2 = Space$(R)
Get #fn, 11, Tag2
lngHeaderPosition = R + 11
End If
Get #fn, 11 + Len(Tag2), sHeader
With mHeader
.MP3Length = FileLen(strFilename)
.Position = 11 + Len(Tag2)
'*** Second Byte ***
sHeader = Mid$(sHeader, 2)
'MPEG Audio version ID
'00 - MPEG Version 2.5
'01 - reserved
'10 - MPEG Version 2 (ISO/IEC 13818-3)
'11 - MPEG Version 1 (ISO/IEC 11172-3)
i = (Asc(sHeader) And 24) / 8
.ID = IIf(i = 0, "MPEG-2.5", IIf(i = 1, "reserved", _
IIf(i = 2, "MPEG-2", "MPEG-1")))
BitLine = IIf(i = 3, 10, 20)
'Layer description
'0 0 Not defined
'0 1 Layer III
'1 0 Layer II
'1 1 Layer I
i = (Asc(sHeader) And 6) / 2
.Layer = IIf(i = 0, "Not defined", IIf(i = 1, "Layer 3", _
IIf(i = 2, "Layer 2", "Layer 1")))
BitLine = BitLine + (4 - i)
'CRC
'0 = No
'1 = Yes
i = (Asc(sHeader) And 1)
.CRC = Not (-i)
' *** Third Byte ***
sHeader = Mid$(sHeader, 2)
i = (Asc(sHeader) And 240) / 16
On Error Resume Next
.BitRate = "Not defined"
.BitRate = BitRate(BitLine, i) & "kbit"
On Error GoTo errorhandler
'Frequency
'value MPEG-1 MPEG-2
'0 0 44100 Hz 22050 Hz
'0 1 48000 Hz 24000 Hz
'1 0 32000 Hz 16000 Hz
'1 1
i = (Asc(sHeader) And 12) / 4
If .ID = "MPEG-1" Then
.SampleRate = IIf(i = 0, "44100 Hz", _
IIf(i = 1, "48000 Hz", "32000 Hz"))
Else
.SampleRate = IIf(i = 0, "22050 Hz", _
IIf(i = 1, "24000 Hz", "16000 Hz"))
End If
'Padding Bit
'0 - frame is not padded
'1 - frame is padded with one extra slot
i = (Asc(sHeader) And 2) / 2
.Padding = i
' *** Forth Byte ***
sHeader = Mid$(sHeader, 2)
'Mode value mode
'0 0 Stereo
'0 1 Joint stereo
'1 0 Dual channel
'1 1 Mono
i = (Asc(sHeader) And 192) / 64
.Mode = IIf(i = 0, "Stereo", IIf(i = 1, "Joint Stereo", _
IIf(i = 2, "Dual channel", "Mono")))
'Copyright
'0 - Audio is not copyrighted
'1 - Audio is copyrighted
i = (Asc(sHeader) And 8) / 8
.CopyRighted = i
'Original
'0 - Copy of original media
'1 - Original media
i = (Asc(sHeader) And 4) / 4
.Original = i
'Emphasis value Emphasis method
'0 0 none
'0 1 50/15ms
'1 0
'1 1 CCITT j.17
i = (Asc(sHeader) And 3)
.Emphasis = IIf(i = 0, "None", IIf(i = 1, "50/15ms", _
IIf(i = 2, "reserved", "CCITT j.17")))
.FrameSize = IIf(.Layer = "Layer 1", _
12 * Val(.BitRate) * 1000 \ Val(.SampleRate) - .Padding, _
144 * Val(.BitRate) * 1000 \ Val(.SampleRate) - .Padding)
.FrameCount = (.MP3Length - .Position - 4) \ .FrameSize
.Duration = ((.MP3Length - .Position - 4) * 8 \ Val(.BitRate)) / 1000
End With
Close
End Sub
Public Function CVL(ByVal Cadena As String, Optional Valor As Integer = 256) _
As Long
Dim i As Integer
CVL = 0
For i = 3 To 0 Step -1
CVL = CVL + (Valor ^ i) * Asc(Cadena)
Cadena = Mid$(Cadena, 2)
Next i
End Function
Private Sub Form_Load()
Dim mHeader As MP3Header
ReadFile "D:\Downloaded Files\MP3\4 Non Blondes - What's Up.mp3", mHeader
With mHeader
lblMPEGInfo.Caption = "Size: " & .MP3Length & " bytes" & _
vbCr & "Header found at: " & .Position & " bytes" & _
vbCr & "Length: " & .Duration & " seconds" & _
vbCr & .ID & " " & .Layer & _
vbCr & .BitRate & ", " & .FrameCount & " frames" & _
vbCr & .SampleRate & " " & .Mode & _
vbCr & "CRCs: " & IIf(.CRC, "Yes", "No") & _
vbCr & "Copyrighted: " & IIf(.CopyRighted, "Yes", "No") & _
vbCr & "Original: " & IIf(.Original, "Yes", "No") & _
vbCr & "Emphasis: " & .Emphasis
End With
End Sub