id3v2 tags suchen



  • Hallo erstmal an alle und frohe Weihnachten :xmas1: ,

    Ich frage hier weniger nach einer Lösung als mehr nach einem Ansatz. Ich sage mal ich bin Anfänger in C++ und möchte etwas tiefer in die Materie eintauchen, folglich habe ich mir in den Kopf gesetzt ein Programm zu schreiben welches mir in der Konsole die ID3v2 tags einer mp3-Datei ausgibt. Ich möchte dazu aber so wenig wie möglich fremde Lib`s einsetzen. Ich dachte daran die Datei binär einzulesen und dann ... irgendwie... nach den Tags zu suchen, nur fehlen mir dazu die nötigen Kenntnisse. Es wäre toll wenn mir jemand pseudomäßig sagen könnte wie man bei soetwas am Besten vorgeht, oder irgendwas was ich mir durchlesen kann. Kurz gesagt, ich wäre froh um einen Anhaltspunkt damit ich weiß wo und wie ich anfangen muss.

    Also frohe Weihnachten und einen schönen Abend, mfG Zeddy





  • http://www.id3.org/Developer_Information

    Da müssten alle Infos zu finden sein die du brauchst um einen ID3v2 Tag zu finden und zu parsen.

    Wie man einen ID3v2 Tag findet: normalerweise steht der ganz am Anfang oder am Ende des MP3 Files. Um herauszufinden wo, bzw. ob da überhaupt ein ID3v2 Tag ist, kann man den Header bzw. Footer des Tags verwenden. D.h. man kann checken ob die Bytes die am Anfang bzw. Ende des Files stehen ein gültiger ID3v2 Header bzw. Footer sind.
    Da sowohl im Header als auch im Footer die Länge des gesamten Tags steht, kann man schnell "das andere Ende" finden, und dort wiederum checken ob es wie ein gültiger ID3v2 Tag aussieht.
    Wenn beide OK aussehen, versucht man einfach den Tag zu parsen.

    Ich denke auch dass das ne gute Übung dafür ist, etwas nach einer vorgegebenen Spezifikation zu implementieren. Vielleicht etwas viel auf Einmal für nen Anfänger, vor allem wenn man wirklich den kompletten Standard implementieren will... Aber IMO keine dumme Idee 🙂



  • Danke für die schnellen Antworten, ich hab mir das jetzt mal in einem Hex-Editor angeschaut und auch gleich schon am Anfang das "ID3" gefunden und dannach schön die Titel usw. Wie ich das aber mit meinem C++ Programm auslesen kann verstehe ich nicht. Wie ich das verstanden habe müsste ich die Datei binär öffnen, dann Byte für Byte einlesen (und ich denke mal in etwas für Menschen lesbares -wie ASCII-Zeichen- umwandeln) und das Ergebnis dann nach "ID3" durchsuchen, um sicherzugehen dass die Datei überhaupt "getagt" ist. Das habe ich versucht aber alles was ich auf der Konsole zu sehen bekam, waren Sonderzeichen ohne Ende. Mein Versuch alles als HEX anzuzeigen überforderte mich dann komplett.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char filename;
        cin>>filename;
        int NumWert= (int)filename;
        int LowNum= NumWert % 16;
        int HighNum= (NumWert-LowNum) / 16;
        char HexArray[2];
        if(HighNum >= 0 && HighNum <= 9)
            HexArray[0] = (char) (HighNum + 48);
        else
            HexArray[0] = (char) (HighNum + 55);
        if(LowNum >= 0 && LowNum <= 9)
            HexArray[1] = (char) (LowNum + 48);
        else
            HexArray[1] = (char) (LowNum + 55);
    
        cout << HexArray<< endl;
        return 0;
    }
    

    Diesen Code habe ich aus dem Internet gefischt aber was mich stuzig macht ist die Ausgabe.
    Wenn ich zb 'a' eingebe, erhalte ich als Ausgabe "61aa". Wie ist sowas möglich? in einem 2Byte Char Array kännen ja maximal 2 Zeichen, egal welcher Art gespeichert werden so wie ich das verstanden habe.
    Meine Frage: Wie wandle ich meine ausgelesenen Bytes in etwas um das ich nach Tags durchsuchen kann, und warum werden mir 4 Zeichen von einem 2Byte Array ausgegeben?

    Danke schonmal nur fürs durchlesen, und ich bin mir absolut bewusst dass jeder erfahrene Programmierer darüber lachen kann, aber ich komm nicht dahinter.

    /Edit Ok, tut mir wirklich leid, ich bin jetzt von selbst dahinter gekommen, also dass mit den 4 zeichen aus 2Bytes interessiert mich immer noch, aber warum bei mir nie was ordentliches ausgelesen wurde lag daran dass wenn ich das Programm unter Code::Blocks debuggen lies, griff es nie wirklich auf die datei zu. Wenn ich nun das Programm im bin/debug Verzeichniss starte läuft es. Wird schon an Vista liegen, danke aber nochmal an euch für die schnellen und vor allem hilfreichen Antworten.



  • Zeddy schrieb:

    char HexArray[2];
    // ...
        cout << HexArray<< endl;
    

    So übergibst du einen Zeiger auf das erste Element des Arrays "HexArray" an "cout". Und "cout" interpretiert das dann als Null-terminierten String. Es werden also so lange Zeichen ausgegeben, bis zufällig ein Null-Byte auftaucht. Das können wie in deinem Fall 4 sein, könnten auch nur 2 sein oder auch 1000.
    Um das zu fixen solltest du das Array 3 Elemente gross machen, und eine Null ins letzte Element schreiben. (Nicht den ASCII Code für "0", sondern eine "binäre" Null.)


Anmelden zum Antworten