ID3 Tag Version Bestimmen

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Darkronight.

    ID3 Tag Version Bestimmen

    Hi,

    Ich würde gerne wissen wie man es anstellt das man die genaue ID3 -Version einer mp3 datei rausbekommt. Da mein Player der auf basis von directx funktuniert und dieser aus mir unbekanten gründen probleme hat mit einer bestimmten id3 version würde ich das gerne mit ein bauen.


    Edit by Manschula: Bitte auf das richtige Unterforum achten! --> Thema aus den Grundlagen verschoben

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manschula“ ()

    Hi,

    Das ist bis jetzt was ich habe an code. Jedoch weis ich nicht wie ich jetzt die genauen versionen erkenne.

    Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim fs As IO.FileStream
    2. Dim br As IO.BinaryReader
    3. Dim id3tag As String
    4. Dim datei As String = "File"
    5. Dim mp3 As New IO.FileInfo(datei)
    6. Dim tag As Integer = (mp3.Length - 128)
    7. fs = New IO.FileStream(datei, IO.FileMode.Open, IO.FileAccess.Read)
    8. br = New IO.BinaryReader(fs)
    9. fs.Position = tag
    10. id3tag = br.ReadChars(3)
    11. MsgBox(id3tag)
    Naja es gibt ja mal zwei große Unterversionen. Id3v1 und Id3v2.
    Während Id3v1 sich immer in den letzten 128 Bytes befindet, befindet sich Id3v2 am Anfang und besitzt eine Art Frame Struktur und kann somit auch beliebig lang sein.
    Du kannst recht einfach Überprüfen ob es ein Id3v1 oder Id3v2 ist. Id3v1: Die ersten 3 Bytes der ingesamt letzten 128 Bytes der Datei muss "TAG" stehen (wenn ich mich richtig errinnere).
    Id3v2: In den ersten 3 Bytes der DATEI muss ID3 stehen. Um die Unterversionen von Id3v2 auslesen zu müssen wirst du wohl den weiter runter müssen. Habe selbst mal eine Bibliothek geschrieben für Id3v2 und Id3v1 und musste dabei jedoch nie beachten welche Unterversion es ist. (falls es überhaupt irgendwo steht).


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Mache es so wie thefiloe vorschlägt.

    Die Spezifikationen zu den 2er-Versionen, wo auch beschrieben wird, wo die Version steht, findest du hier: id3.org/Developer_Information
    Du kannst auch einen Hex-Editor verwenden, um die Spezifikationen besser nachvollziehen zu können.

    Und natürlich ist es auch möglich, dass eine Datei einen ID3v1-Tag UND einen ID3v2-Tag besitzt.

    Außerdem:
    - Option Strict On!
    - Schau dir die Methoden und Eigenschaften FileStream-Klasse an: Seek(), Length, Read(), ...
    - Der BinaryReader eignet sich zum Lesen von MP3-Dateien nicht, da er nicht die richtige Bytereihenfolge verwendet.
    So hab nochma nachgeschaut. Version steht wie ich mir dachte im Header. Wusste nur nicht mehr obs im extended or normalen header ist.
    Wie bereites gesagt header: id3.org/id3v2.4.0-structure punkt 3.1


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Nagut das ist schon mal sehr viel was mich weiter bringt jedoch habe ich auf die schnelle in meiner sammlung keine datei gefunden wo die v genau drin ist. Gibs irg wo wo man test fils laden kann wo auch diese drin stehen?
    Jede MP3-Datei mit einem ID3-Tag ab Version 2 sollte die Versionsinformation behinhalten. thefiloe hat ja bereits geschrieben, wo du sie findest. Mit einem Hexeditor kannst du das gut nachvollziehen.
    Wenn du Probleme bei der Umsetzung hast, kannst du ja mal deinen bisherigen Code posten. Wie gesagt, der BinaryReader ist für MP3-Files zu nichts zu gebrauchen, genauso wenig wie die Methoden der BitConverter-Klasse.
    In diesem Fall muss ich ihm aber zustimmen. Bei mir sind auch in vielen Dateien die Versionen 00 00. Müsste ja Byte 4 und 5 des headers sein. Und ich lese Header grundsätzlich richtig (hab allgemein eine kleine ID3 Lib gemacht)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Wenn der Tag am Anfang der Datei steht, dann muss die Version im 4. und 5. Byte stehen. Hab unter meinen MP3-Dateien mal nachgeschaut, aber ich hab keine gefunden wo Byte 4 auf null stand (in der Regel habe ich Version 3 gefunden). Als Tag-Editor habe ich meinen eigenes VB Programm und Windows verwendet, außer die Dateien hatten schon Tags, wie ich sie bekommen hatte. Welchen Tag-Editor verwendest du denn?

    Wenn die Version nicht angegeben ist, würde ich einfach mal die niedrigste ID3v2-Version annehmen.

    Infinity schrieb:

    Jede MP3-Datei mit einem ID3-Tag ab Version 2 sollte die Versionsinformation behinhalten. thefiloe hat ja bereits geschrieben, wo du sie findest. Mit einem Hexeditor kannst du das gut nachvollziehen.
    Wenn du Probleme bei der Umsetzung hast, kannst du ja mal deinen bisherigen Code posten. Wie gesagt, der BinaryReader ist für MP3-Files zu nichts zu gebrauchen, genauso wenig wie die Methoden der BitConverter-Klasse.



    Was ist denn geeignet zum auslesen vom mp3 ? Wenn der binaryreader "scheiße" ist.
    Mit der Read-Funktion des FileStreams die Bytes aus der Datei lese und dann z. B. 4 Bytes mit Hilfe von Bitoperatoren in einen Integer umwandeln. Im Fall der ID3-Version musst du sogar nichts mal mehr umwandeln, du kannst direkt die mit der Read-Funktion gelesenen Bytes verwenden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Infinity“ ()

    Edit:

    Habe es rausbekommen Ich hoffe das der code soweit ok ist.

    VB.NET-Quellcode

    1. Dim datei As String = "C:\Users\Daniel\Desktop\id3_1.mp3"
    2. Dim fs As IO.FileStream = New IO.FileStream(datei, IO.FileMode.Open, IO.FileAccess.Read)
    3. Dim byt(3) As Byte
    4. fs.Seek(0, SeekOrigin.Begin)
    5. fs.Read(byt, 0, 3)
    6. MsgBox(System.Text.Encoding.ASCII.GetString(byt))
    7. fs.Close()

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Darkronight“ ()

    Ähm ja das ist das lesen der ersten 3 Bytes der Datei. Die Subversion hast du jedoch nicht genauso wenig wie die info ob ID3v1 vorhanden ist. (beachte es können 2 ID3-Tags vorkommen v1 und v2)
    Aber ja wenn in der MessageBox ID3 steht hast du einen ID3v2 Tag.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich hab deinen Code etwas angepasst. Die Erklärung steht in den Kommentaren.

    VB.NET-Quellcode

    1. Dim datei As String = "C:\Users\Daniel\Desktop\id3_1.mp3"
    2. Dim fs As IO.FileStream = New IO.FileStream(datei, IO.FileMode.Open, IO.FileAccess.Read)
    3. Dim byt(2) As Byte 'Du möchtest maximal 3 Bytes lesen, also verwende auch die richtige Arraygröße.
    4. 'Die unnötige Zeile (fs.Seek...) hab ich gelöscht
    5. fs.Read(byt, 0, 3)
    6. if byt(0) = &h49 andalso byt(1) = &h44 andalso byt(2) = &h33 then 'Werte der 1. 3 Bytes prüfen
    7. fs.Read(byt, 0, 2) 'die nächsten 2 Bytes lesen - die enthalten die Versionsinformation
    8. MessageBox.Show(string.format("ID3v2.{0}.{1} Tag vorhanden.",byt(0),byt(1)))
    9. else
    10. MessageBox.Show("Kein ID3v2.X Tag vorhanden, zumindest nicht am Dateianfang!")
    11. end if
    12. fs.seek(128l, seekorigin.end) 'Um auf den IDv1 Tag zu prüfen ans Ende - 128 springen
    13. fs.read(byt, 0, 3)
    14. if byt(0) = &54 andalso byt(1) = &h41 andalso byt(2) = &h47 then 'wieder die Werte prüfen
    15. MessageBox.Show("ID3v1 Tag vorhanden")
    16. else
    17. MessageBox.Show("Kein ID3v1 Tag vorhanden")
    18. end if
    19. fs.Close()


    Ich habe den Code eben kurz eingetippt ohne ihn zu testen. Es kann sein dass er Fehler enthält, aber die Vorgehensweise sollte stimmen.
    In der Spezifikation steht, dass der Tag nicht zwangsläufig am Anfang stehen muss, deshalb der Hinweis. Mir sind auch schon MP3-Dateien untergekommen, die 2 ID3v2-Tags hatten oder dass am Anfang der datei ein Paar leere Bytes waren. Ich weiß allerdings nicht, welcher Tag-Editor diese Fails produziert hat, weil ich die Dateien nicht selber encoded hab.
    Schon mal ein dankeschon an euch das ih mir helft. Mir ist jetzt aufgefallen wenn ich deinen code verwende kömmt egal welche datei ich nehme immer ID3v2.3.0 raus liegt das jetzt an dein code oder erwische ich immer die falschen daten?
    Kann schon sein dass es stimmt. Die ganzen Dateien die du hast, sind ja evtl. auch alle vom selben Tag-Editor. Die ID3v2.3.0 ist auch die am häufigsten verwendete Version (zumindest in meiner Musiksammlung). Die Version ID3v2.4.0 ist zwar aktueller, wird aber nicht so oft verwendet, und vom Explorer und von alten Playern auch noch nicht unterstützt.