Rubrik: Multimedia & Sound · Audio | VB-Versionen: VB6 | 24.12.02 |
Prüfen und Auslesen des ID3v2-Tags einer MP3-Datei Dieser Tipp verrät, wie sich die erweiterten Informationen (ID3v2-Tags) einer MP3-Datei auslesen lassen. | ||
Autor: Jochum Rene | Bewertung: | Views: 31.875 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Wie man die ID3v1-Tag einer MP3-Datei ausliest, haben wir in den Tipps & Tricks bereits abgehandelt. Was jetzt noch fehtl, ist das Auslesen der erweiterten Informationen - sprich ID3v2-Tags. Ob eine MP3-Datei über diese erweiterten Infos verfügt, prüfen Sie über MP3_ID3v2Exist. Die Funktion gibt entweder den Wert 0 zurück (keine ID3v2-Infos vorhanden) oder die ein Wert größer 0, der dann die Länge des ID3v2-Tags entspricht. Diese Länge ist wichtig für das Auslesen der Informationen!
Hinweis:
Den ID3v2-Tag gibt es in unterschiedlichen Versionen. Nachfolgender Code wurde mit ID3v2.3 getestet.
Fügen Sie nachfolgenden Code bitte in ein Modul ein:
Option Explicit ' ID3v2-Infostruktur Public Type ID3v2 sTitle As String sArtist As String sAlbum As String sComment As String sYear As String sGenre As String sComposer As String sURL As String sOrgArtist As String sCopyright As String sEncodeBy As String sTrack As String sMedium As String sLen As String End Type
' Prüfen, ob eine MP3-Datei über ID3v2-Infos verfügt ' Rückgabewert: Länge des ID3v2-Tags Public Function MP3_ID3v2Exists( _ ByVal sFile As String) As Long Dim sText As String Dim sBin As String Dim sID3 As String * 3 Dim i As Integer Dim z As Integer Dim b(4) As Byte Dim F As Integer Dim nID3v2Size As Long ' Datei öffnen On Error GoTo ErrHandler F = FreeFile Open sFile For Binary As #F Get #F, 1, sID3 If sID3 <> "ID3" Then MP3_ID3v2Exists = 0 Close #F Exit Function End If ' Größe des ID3v2-Tags ermitteln Get #F, 7, b(4) Get #F, 8, b(3) Get #F, 9, b(2) Get #F, 10, b(1) sBin = "" For z = 2 To 4 For i = 0 To 6 sBin = sBin & CStr(Abs(b(z) And (2 ^ i))) Next i Next z nID3v2Size = 0 For i = 7 To 27 nID3v2Size = nID3v2Size + ((2 ^ i) * _ Val(Mid(sBin, i - 6, 1))) Next i nID3v2Size = nID3v2Size + b(1) + 10 MP3_ID3v2Exists = nID3v2Size Close #F Exit Function ErrHandler: If F > 0 Then Close #F MP3_ID3v2Exists = 0 End Function
' ID3v2-Infos auslesen Public Function MP3_ReadID3v2Tag( _ ByVal sFile As String, _ ByVal nID3v2Size As Long) As ID3v2 Dim nPos As Long Dim sFrameType As String * 4 Dim sText As String Dim sBin As String Dim sID3 As String * 3 Dim i As Integer Dim z As Integer Dim b(4) As Byte Dim F As Integer Dim nSize As Long On Error GoTo ErrHandler ' Datei öffnen F = FreeFile Open sFile For Binary As #F ' Start-Position nPos = 11 ' Liest den Framtyp so lange aus bis es nichts ' mehr zum lesen gibt Do While nPos < nID3v2Size ' der eingelesene Framtyp Get #F, nPos, sFrameType If InStr(sFrameType, Chr$(0)) > 0 Then ' Fertig nichts mehr zum lesen Close #F Exit Do End If nPos = nPos + 4 Get #F, nPos, b(4) ' FrameTyp Größe Get #F, nPos + 1, b(3) ' FrameTyp Größe Get #F, nPos + 2, b(2) ' FrameTyp Größe Get #F, nPos + 3, b(1) ' FrameTyp Größe nPos = nPos + 5 sBin = "" For z = 2 To 4 For i = 0 To 7 Step 1 sBin = sBin & CStr(Abs(b(z) And (2 ^ i))) Next i Next z ' Framtyp-Größe ausrechnen nSize = 0 For i = 8 To 30 nSize = nSize + ((2 ^ i) * Val(Mid$(sBin, i - 7, 1))) Next i nSize = nSize + b(1) ' ID3v2-Info sText = String$(nSize, vbNullChar) nPos = nPos + 1 Get #F, nPos, sText sText = TrimNullChar(sText) With MP3_ReadID3v2Tag Select Case sFrameType Case "TMED" .sMedium = sText Case "TLEN" .sLen = sText Case "TRCK" .sTrack = sText Case "TENC" .sEncodeBy = sText Case "WXXX" .sURL = sText Case "TCOP" .sCopyright = sText Case "TOPE" .sOrgArtist = sText Case "TCOM" .sComposer = sText Case "COMM" .sComment = sText Case "TCON" ' evtl. vorhandene Klammern entfernen sText = Replace(sText, "(", "") sText = Replace(sText, ")", "") .sGenre = sText Case "TYER" .sYear = sText Case "TALB" .sAlbum = sText Case "TPE1" .sArtist = sText Case "TIT2" .sTitle = sText End Select nPos = nPos + nSize End With Loop ErrHandler: Close #F End Function
' Hilfsfunktion, um Null-Zeichen und überflüssige ' Leerzeichen zu entfernen Private Function TrimNullChar( _ ByVal sString As String) As String sString = Replace(sString, vbNullChar, "") TrimNullChar = Trim$(sString) End Function
Beispiel für den Aufruf:
Im nachfolgenden ein kleines Beispiel, das prüft, ob eine MP3-Datei über ID3v2-Infos verfügt und diese in ggf. in einer MultiLine-TextBox ausgibt.
Dim sFile As String Dim uID3v2 As ID3v2 Dim nSize As Long ' MP3-Datei sFile = App.Path & "\mySong.mp3" ' Existieren ID3v2-Infos? nSize = MP3_ID3v2Exists(sFile) If nSize > 0 Then ' ID3v2-Infos auslesen und anzeigen uID3v2 = MP3_ReadID3v2Tag(sFile) With uID3v2 Text1.Text = "Titel: " & .sTitle & vbCrLf & _ "Interpret: " & .sArtist & vbCrLf & _ "Album: " & .sAlbum & vbCrLf & _ "Track: " & .sTrack & vbCrLf & _ "Länge: " & .sLen & vbCrLf & _ "Medium: " & sMedium & vbCrLf End With Else MsgBox "Keine ID3v2-Infos vorhanden!" End If