Verständnis problem mit der ID3-Tag.



  • hallo,
    ich habe mir vor kurzem (1stunde her oder so xD ) einen quelltext angesehen der die ID3 einer mp3 ausliest. also ich habe verstanden das die ID3-Tag, interprät, songtitle, länge ect. enthält. aber ich bin net ganz durchgestiegen wie das so eigentlich funktioniert. und zwar in diesem code stand drin

    // hat sich erst mal ne struct gebaut um alle infos zu speichern
    struct ID3V1 {
    
        char id[4];
        char title[31];
        char artist[31];
        char album[31];
        char year[5];
        char comment[31];
        char genre[2];
    }; 
    
    // in der main
    int main() {
    
        char szMP3File[] = "test.mp3\0";  //Name der MP3
        ID3V1 mp3_info;
        DWORD dwNumofBytes, dwFSize;
    
        HANDLE hMP3File = CreateFile( szMP3File, GENERIC_READ, FILE_SHARE_READ,
                                       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    
        dwFSize = GetFileSize(hMP3File, NULL);
    
        SetFilePointer(hMP3File, -128, 0, FILE_END);
    
        ReadFile(hMP3File, mp3_info.id, 3, &dwNumofBytes, 0);
    
        if( !strstr( mp3_info.id, "TAG" ) ) {
    
            mp3_info.title[0] = '\0';
            mp3_info.artist[0] = '\0';
            mp3_info.album[0] = '\0';
            mp3_info.year[0] = '\0';
            mp3_info.comment[0] = '\0';
            mp3_info.genre[0] = '\0';
            CloseHandle(hMP3File);
            return -1;
        }
    
        ReadFile(hMP3File, mp3_info.title, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.artist, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.album, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.year, 4, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.comment, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, &mp3_info.genre[0], 1, &dwNumofBytes, NULL);
    
        mp3_info.album[30] = '\0';
        mp3_info.artist[30] = '\0';
        mp3_info.comment[30] = '\0';
        mp3_info.genre[1] = '\0';
        mp3_info.title[30] = '\0';
        mp3_info.year[4] = '\0';
    
        cout<<"MP3:       "<<szMP3File<<endl
            <<"Titel:     "<<mp3_info.title<<endl
            <<"Kuenstler: "<<mp3_info.artist<<endl
            <<"Album      "<<mp3_info.album<<endl
            <<"Jahr:      "<<mp3_info.year<<endl
            <<"Kommentar: "<<mp3_info.comment<<endl
            <<"Genre:     "<<genres[(int)mp3_info.genre[0]]<<endl;
    
        cin.get();
        return 0;
    }
    

    also er öffnet eine mp3 datei und dann weiss ich net ganz wozu der rest gut ist. ersucht irgendwie in der datei nach "TAG"( nicht der tag ich weiss 🙂 ) und dann macht er ein paar aufrufe von ReadFile, würde das net heissen das er immer an der selben stelle liesst?

    hilfe waer net.

    weiter habe ich noch eine frage, wenn ich auf meinen rechner eine music datei abspiele( mp3, weil ich das ganze nachher in verbindung bringen moechte ), egal von welchen audiogerät( wmp, createive, winamp ect...) wie bekomm ich den aktuellen mp3file so raus?, geht das überhaupt?

    Gruß Tobi.



  • Hiho,
    grundsaetzlich funktioniert das so:

    // hat sich erst mal ne struct gebaut um alle infos zu speichern
    struct ID3V1 {
    
        char id[4];
        char title[31];
        char artist[31];
        char album[31];
        char year[5];
        char comment[31];
        char genre[2];
    };
    
    // in der main
    int main() {
    
        char szMP3File[] = "test.mp3\0";  //Name der MP3
        ID3V1 mp3_info;
        DWORD dwNumofBytes, dwFSize;
    
        HANDLE hMP3File = CreateFile( szMP3File, GENERIC_READ, FILE_SHARE_READ,
                                       NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    
        dwFSize = GetFileSize(hMP3File, NULL);
    
        // Dateizeiger auf 128 bytes for das Ende der Datei setzen
        // FILE_END = Ende; -128 = halt noch 128 bytes zurueck
        // dort befinden sich offensichtlich immer die ID3 Tags
        SetFilePointer(hMP3File, -128, 0, FILE_END);
    
        // dann werden 3 Bytes in die id eingelesen
        ReadFile(hMP3File, mp3_info.id, 3, &dwNumofBytes, 0);
    
        // wenn die id jetzt nicht "TAG" ist, gibt es offensichtlich keinen
        // ID3 Tag und es erfolgt abbruch
        if( !strstr( mp3_info.id, "TAG" ) ) {
    
            mp3_info.title[0] = '\0';
            mp3_info.artist[0] = '\0';
            mp3_info.album[0] = '\0';
            mp3_info.year[0] = '\0';
            mp3_info.comment[0] = '\0';
            mp3_info.genre[0] = '\0';
            CloseHandle(hMP3File);
            return -1;
        }
    
        // ansonsten koennen alle Werte entsprechend ihrer groesse gelesen werden
        // der Dateizeiger wird dabei automatisch so viele Bytes weiter gesetzt,
        // wie gelesen wurden
        // die Strings stehen also mit genau der Groesse und in dieser Reihenfolge
        // in der Datei
        ReadFile(hMP3File, mp3_info.title, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.artist, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.album, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.year, 4, &dwNumofBytes, NULL);
        ReadFile(hMP3File, mp3_info.comment, 30, &dwNumofBytes, NULL);
        ReadFile(hMP3File, &mp3_info.genre[0], 1, &dwNumofBytes, NULL);
    
        // Die Strings noch nullterminieren...
        mp3_info.album[30] = '\0';
        mp3_info.artist[30] = '\0';
        mp3_info.comment[30] = '\0';
        mp3_info.genre[1] = '\0';
        mp3_info.title[30] = '\0';
        mp3_info.year[4] = '\0';
    
        // ... und ausgeben
        cout<<"MP3:       "<<szMP3File<<endl
            <<"Titel:     "<<mp3_info.title<<endl
            <<"Kuenstler: "<<mp3_info.artist<<endl
            <<"Album      "<<mp3_info.album<<endl
            <<"Jahr:      "<<mp3_info.year<<endl
            <<"Kommentar: "<<mp3_info.comment<<endl
            <<"Genre:     "<<genres[(int)mp3_info.genre[0]]<<endl;
    
        cin.get();
        return 0;
    }
    

    Btw. gut das du so ein Beispiel anbringst 😃 brauche das wohl auch mal in naechster Zeit

    weiter habe ich noch eine frage, wenn ich auf meinen rechner eine music datei abspiele( mp3, weil ich das ganze nachher in verbindung bringen moechte ), egal von welchen audiogerät( wmp, createive, winamp ect...) wie bekomm ich den aktuellen mp3file so raus?, geht das überhaupt?

    Das versteh ich jetzt nicht oO Wenn du die Datei mit Winamp abspielt weisst du doch, dass sie gespielt wird. Und ausserdem zeigt Winamp das an. Andere Programme sollten es auch anzeigen. Aber das war sicherlich nicht exakt die gewuenschte Antwort 😉

    Gruss,
    DeSoVoDaMu



  • das weiss ich auch-.-, kann man nun irgendwie systemweit den gerade aktuellen title der gespielt wird abfangen? und den pfad zu datei bestimmen?



  • Dir ist klar, dass du ein Programm auch 2 mal oeffnen kannst oder 2 verschiedene Programme und beide spielen unterschiedliche Titel?



  • hmm joa... ist mir auch beim weiteren denken klar gewurden...
    also muesste ich irgendwie mein audiotool ausspionieren... hmmm aber wie?



  • Eventuell hilft dir ja das für Winamp weiter:
    http://www.vb-magazin.de/archiv/215.htm
    vergleichbares wird sich vllt auch für andere Programme finden/machen lassen.

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten