vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Multimedia & Sound · Audio   |   VB-Versionen: VB624.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 ReneBewertung:  Views:  31.875 
ohne HomepageSystem:  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



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.