В форме.
Option Explicit
Dim accMP3Info As MP3Info
Private Sub Form_Load()
Me.OLEDropMode = 1
Me.Caption = "Тащи на форму файл МР3"
End Sub
Private Sub Form_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Data.GetFormat(vbCFFiles) = True Then
Dim c As Long
For c = 1 To Data.Files.Count
MP3FileName = Data.Files(c)
Next c
End If
getMP3Info MP3FileName, accMP3Info
Print accMP3Info.LENGTH
End Sub
в форме
Option Explicit
Public MP3FileName As String
Public Type VBRinfo
VBRrate As String
VBRlength As String
End Type
Public Type MP3Info
BITRATE As String
CRC As String
LAYER As String
LENGTH As String
MPEG As String
End Type
Private MP3Length As Long
Public Sub getMP3Info(ByVal lpMP3File As String, ByRef lpMP3Info As MP3Info)
Dim Buf As String * 4096
Dim infoStr As String * 3
Dim lpVBRinfo As VBRinfo
Dim tmpByte As Byte
Dim tmpNum As Byte
Dim i As Integer
Dim designator As Byte
Dim baseFreq As Single
Dim vbrBytes As Long
Open lpMP3File For Binary As #1
Get #1, 1, Buf
Close #1
For i = 1 To 4092
If Asc(Mid(Buf, i, 1)) = &HFF Then
tmpByte = Asc(Mid(Buf, i + 1, 1))
If Between(tmpByte, &HF2, &HF7) Or Between(tmpByte, &HFA, &HFF) Then
Exit For
End If
End If
Next i
If i = 4093 Then
MsgBox "Not a MP3 file...", vbCritical, "Error..."
Else
infoStr = Mid(Buf, i + 1, 3)
'Getting info from 2nd byte(MPEG,Layer type and CRC)
tmpByte = Asc(Mid(infoStr, 1, 1))
'Getting CRC info
If ((tmpByte Mod 16) Mod 2) = 0 Then
lpMP3Info.CRC = "Yes"
Else
lpMP3Info.CRC = "No"
End If
'Getting MPEG type info
If Between(tmpByte, &HF2, &HF7) Then
lpMP3Info.MPEG = "MPEG 2.0"
designator = 1
Else
lpMP3Info.MPEG = "MPEG 1.0"
designator = 2
End If
'Getting layer info
If Between(tmpByte, &HF2, &HF3) Or Between(tmpByte, &HFA, &HFB) Then
lpMP3Info.LAYER = "layer 3"
Else
If Between(tmpByte, &HF4, &HF5) Or Between(tmpByte, &HFC, &HFD) Then
lpMP3Info.LAYER = "layer 2"
Else
lpMP3Info.LAYER = "layer 1"
End If
End If
tmpByte = Asc(Mid(infoStr, 2, 1))
tmpNum = tmpByte \ 16 Mod 16
If designator = 1 Then
If tmpNum < &H8 Then
lpMP3Info.BITRATE = tmpNum * 8
Else
lpMP3Info.BITRATE = 64 + (tmpNum - 8) * 16
End If
Else
If tmpNum <= &H5 Then
lpMP3Info.BITRATE = (tmpNum + 3) * 8
Else
If tmpNum <= &H9 Then
lpMP3Info.BITRATE = 64 + (tmpNum - 5) * 16
Else
If tmpNum <= &HD Then
lpMP3Info.BITRATE = 128 + (tmpNum - 9) * 32
Else
lpMP3Info.BITRATE = 320
End If
End If
End If
End If
MP3Length = FileLen(lpMP3File) \ (Val(lpMP3Info.BITRATE) / 8) \ 1000
If Mid(Buf, i + 36, 4) = "Xing" Then
lpMP3Info.LENGTH = lpVBRinfo.VBRlength
Else
lpMP3Info.LENGTH = MP3Length
End If
End If
End Sub
Public Function Between(ByVal accNum As Byte, ByVal accDown As Byte, ByVal accUp As Byte) As Boolean
If accNum >= accDown And accNum <= accUp Then
Between = True
Else
Between = False
End If
End Function
Ответить
|