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

https://www.vbarchiv.net
Rubrik: Multimedia & Sound · Audio   |   VB-Versionen: VB2005, VB200808.07.09
Auslesen, ändern und speichern von ID3v1-Tags

Dieses Beispiel zeigt, wie sich die MP3-Informationen ID3v1 auslesen, ändern und wieder speichern lassen - einschließlich Genre.

Autor:   Dieter OtterBewertung:  Views:  17.501 
www.tools4vb.deSystem:  Win2k, WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Vor längerer Zeit hatten wir in einem Tipp gezeigt, wie sich MP3-Informationen (ID3v1) auslesen lassen:
 MP3-Informationen auslesen (.NET)

Unser heutiger Tipp liest nicht nur alle ID3v1-Tag Informationen aus, sondern kann diese auch wieder zurückspeichern.

Die MP3-Informationen werden hierbei in einem benutzerdefinierten Datentyp zwischengespeichert:

' Daten-Struktur der MP3-Informationen
Private Structure MP3Info
  Dim Titel As String
  Dim Interpret As String
  Dim Album As String
  Dim Jahr As String
  Dim Kommentar As String
  Dim Genre As Byte
End Structure
' Genre-Auflistung
Private Enum Genre
  Blues = 0
  ClassicRock = 1
  Country = 2
  Dance = 3
  Disco = 4
  Funk = 5
  Grunge = 6
  HipHop = 7
  Jazz = 8
  Meta = 9
  NewAge = 10
  Oldies = 11
  Other = 12
  Pop = 13
  R_B = 14
  Rap = 15
  Reggae = 16
  Rock = 17
  Techno = 18
  Industrial = 19
  Alternative = 20
  Ska = 21
  DeathMetal = 22
  Pranks = 23
  Soundtrack = 24
  EuroTechno = 25
  Ambient = 26
  TripHop = 27
  Vocal = 28
  JazzFunk = 29
  Fusion = 30
  Trance = 31
  Classical = 32
  Instrumental = 33
  Acid = 34
  House = 35
  Game = 36
  SoundClip = 37
  Gospel = 38
  Noise = 39
  AltRock = 40
  Bas = 41
  Soul = 42
  Punk = 43
  Space = 44
  Meditative = 45
  InstrumentalPop = 46
  InstrumentalRock = 47
  Ethnic = 48
  Gothic = 49
  Darkwave = 50
  TechnoIndustrial = 51
  Electronic = 52
  PopFolk = 53
  Eurodance = 54
  Dream = 55
  SouthernRock = 56
  Comedy = 57
  Cult = 58
  Gangsta = 59
  Top40 = 60
  ChristianRap = 61
  Pop_Funk = 62
  Jungle = 63
  NativeAmerican = 64
  Cabaret = 65
  NewWave = 66
  Psychadelic = 67
  Rave = 68
  Showtunes = 69
  Trailer = 70
  LoFi = 71
  Tribal = 72
  AcidPunk = 73
  AcidJazz = 74
  Polka = 75
  Retro = 76
  Musical = 77
  RockNRoll = 78
  HardRock = 79
  Folk = 80
  Folk_Rock = 81
  NationalFolk = 82
  Swing = 83
  Fusion1 = 84
  Bebob = 85
  Latin = 86
  Revival = 87
  Celtic = 88
  Bluegrass = 89
  Avantgarde = 90
  GothicRock = 91
  ProgressiveRock = 92
  PsychedelicRock = 93
  SymphonicRock = 94
  SlowRock = 95
  BigBand = 96
  Chorus = 97
  EasyListening = 98
  Acoustic = 99
  Humour = 100
  Speech = 101
  Chanson = 102
  Opera = 103
  ChamberMusic = 104
  Sonata = 105
  Symphony = 106
  BootyBass = 107
  Primus = 108
  PornGroove = 109
  Satire = 110
  SlowJam = 111
  Club = 112
  Tango = 113
  Samba = 114
  Folklore = 115
End Enum

ID3v1-Tag einer MP3-Datei auslesen

''' <summary>
''' Liest den ID3V1-Tag einer MP3-Datei aus
''' </summary>
''' <param name="sFile">MP3-Dateiname</param>
''' <returns>Struktur mit den MP3-Informationen</returns>
Private Function ReadMP3Info(ByVal sFile As String) As MP3Info
  Dim oInfo As New MP3Info
 
  ' Prüfen, ob Datei auch existiert
  If System.IO.File.Exists(sFile) Then
    Try
      Dim oStream As New System.IO.FileStream(sFile, IO.FileMode.Open)
 
      ' Position des MP3-Tags
      oStream.Seek(-128, IO.SeekOrigin.End)
 
      ' jetzt 128 Bytes lesen
      Dim bData(127) As Byte
      oStream.Read(bData, 0, 128)
 
      ' Byte in String umwandeln
      Dim sData As String = System.Text.Encoding.Default.GetString(bData)
 
      ' Prüfen, ob Daten mit TAG beginnen
      If sData.Substring(0, 3) = "TAG" Then
        With oInfo
          ' jetzt die Struktur mit den Infos füllen
          .Titel = StripNull(sData.Substring(3, 30))
          .Interpret = StripNull(sData.Substring(33, 30))
          .Album = StripNull(sData.Substring(63, 30))
          .Jahr = StripNull(sData.Substring(93, 4))
          .Kommentar = StripNull(sData.Substring(97, 30))
          .Genre = bData(127)
        End With
      End If
      oStream.Close()
 
    Catch ex As Exception
    End Try
  End If
 
  ' Rückgabewert: MP3Info
  Return (oInfo)
End Function

ID3v1-Tag speichern

''' <summary>
''' Speichert die IDVv1-Informationen in die angegebene Datei
''' </summary>
''' <param name="sFile">MP3-Dateiname</param>
''' <param name="Info">MP3Info-Struktur</param>
Private Function SaveMP3Info(ByVal sFile As String, ByVal Info As MP3Info) As Boolean
  Dim Success As Boolean = False
 
  ' Prüfen, ob Datei auch existiert
  If System.IO.File.Exists(sFile) Then
    Try
      Dim oStream As New System.IO.FileStream(sFile, IO.FileMode.Open)
 
      ' Position des MP3-Tags
      oStream.Seek(-128, IO.SeekOrigin.End)
 
      ' jetzt die MP3-Infos in ein Byte-Array konvertieren
      Dim bData(127) As Byte
      With Info
        FillData(bData, 0, "TAG")
        FillData(bData, 3, .Titel)
        FillData(bData, 33, .Interpret)
        FillData(bData, 63, .Album)
        FillData(bData, 93, .Jahr)
        FillData(bData, 97, .Kommentar)
        bData(127) = .Genre
      End With
      oStream.Write(bData, 0, 128)
      oStream.Close()
 
      Success = True
 
    Catch ex As Exception
    End Try
  End If
 
  ' Rückgabewert: Success
  Return (Success)
End Function

Hilfsfunktionen

' Sucht nach dem ersten Null-Zeichen und gibt den linken Teil
' des Strings zurück
Private Function StripNull(ByVal sData As String) As String
  Dim nPos As Integer = sData.IndexOf(Chr(0))
  If nPos >= 0 Then
    Return sData.Substring(0, nPos).TrimEnd
  Else
    Return sData.TrimEnd
  End If
End Function
' Kopiert den Text an die angegebene Position in das Byte-Array
Private Sub FillData(ByRef Data() As Byte, _
  ByVal StartPos As Integer, ByVal Text As String)
 
  Dim bData() As Byte = System.Text.Encoding.Default.GetBytes(Text)
  For i As Integer = 0 To bData.Length - 1
    Data(StartPos + i) = bData(i)
  Next
End Sub

Beispiel
Zunächst werden die MP3-Informationen einer MP3-Datei ausgelesen und in einem benutzerdefinierten Datentyp zwischengespeichert.

' MP3-Infos lesen und anzeigen
Dim sFile As String = "d:\test.mp3"
Dim oInfo As MP3Info = ReadMP3Info(sFile)

Jetzt werden die MP3-Informationen verändert...

With oInfo
  .Title = "MyMP3 File"
  .Artist = "Me"
  .Album = "My Album"
  .Year = "2009"
  .Comments = "No comment"
  .Genre = CByte(Genre.Disco)
End With

Diese Änderungen sollen nun in die MP3-Datei gespeichert werden...

If SaveMP3Info(sFile, oInfo) Then
  MsgBox("MP3-Informationen wurden erfolgreich geschrieben!", MsgBoxStyle.Information)
Else
  MsgBox("MP3-Informationen konnten nicht gespeichert werden!", MsgBoxStyle.Exclamation)
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.