ID3Tag V1 Problem



  • Hi

    ich versuche gerade, einen ID3 Tag in ansi-C auszuslesen. Aber nur mit gemäßigtem erfolg

    Hier der Code

    //---------------------------------------------------------------//
    //          ID3-TAGs aus mp3-Datei auslensen und ausgeben        //
    //---------------------------------------------------------------//
    
    int id3auslesen(FILE *pfile)
    {
        struct id3
        {
            char sz_titel[31];
            char sz_interpret[31];
            char sz_album[31];
            int i_jahr;
            char sz_kommentar[31];
            int i_grene;
        }mp3;
    
        fseek(pfile, -125 ,SEEK_END);
        fread(&mp3.sz_titel ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.sz_interpret ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.sz_album , 30 , 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.i_jahr , 4 , 1, pfile);
        fseek(pfile, 4 ,SEEK_CUR);
        fread(&mp3.sz_kommentar ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.i_grene ,1, 1, pfile);
    
        printf("\nTitel: %s", mp3.sz_titel);
        printf("\nInterpret: %s",mp3.sz_interpret);
        printf("\nAlbum: %s",mp3.sz_album);
        printf("\nErscheinungsjahr: %i",mp3.i_jahr);
        printf("\nKommentar: %s",mp3.sz_kommentar);
        printf("\nGrene: %i\n\n",mp3.i_grene);
        return 0;
    }
    

    Es geht nur bis zum Album gut. Danach wird nur "Müll" ausgelesen. Wieso?

    mfg

    Bernd



  • probier mal das jahr als char einzulesen.
    der rest comment und genre ist meist nicht ausgefuellt.



  • ne, daran liegt das nicht

    vielleicht kann sich mal jmd. das komplette programm anschauen.

    #include <stdio.h>
    #include <stdlib.h>
    
    int menu_ausgeben(void);
    int neu(void);
    int laden(void);
    int speichern(void);
    int suchen(void);
    int loeschen(void);
    int eingabe_pruefen(char c_eingabe);
    int eingabe_auswerten(void);
    int id3auslesen(FILE *);
    
    int main()
    {
        menu_ausgeben();
        eingabe_auswerten();
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                      Gibt das Menü aus                        //
    //      (dient auch zum Löschen des Bildschirminhaltes)          //
    //---------------------------------------------------------------//
    
    int menu_ausgeben()
    {
        system("cls");
    
        printf("\t\t---------------------------------------------------------\n");
        printf("\t\t|\t\t\tID3-TAG-EDITOR\t\t\t|\n");
        printf("\t\t---------------------------------------------------------\n\n");
    
        printf("\t\t 1) Neu\n");
        printf("\t\t 2) Laden\n");
        printf("\t\t 3) Schliessen\n");
        printf("\t\t 4) Speichern\n");
        printf("\t\t 5) Suchen\n");
        printf("\t\t 6) Loeschen\n");
        printf("\t\t 7) Beenden\n");
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                  Menüpunkt neu                                //
    //---------------------------------------------------------------//
    
    int neu()
    {
        printf("\nNeu");
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                  Menüpunkt laden                              //
    //---------------------------------------------------------------//
    
    int laden()
    {
    
        char sz_pfad[255];
        unsigned long ullaenge;
        FILE *pfile;
        printf("\nBitte gebe Sie den Pfad und Dateinamen (z.B. C:\\Programme\\test.mp3) ein: \n");
        scanf("%s", sz_pfad);
        printf("\nlade Datei %s ...", sz_pfad);
        pfile = fopen(sz_pfad,"rb");
        if (pfile == NULL)
        {
            printf("\nEs ist ein Fehler aufgetreten.");
            return 0;
        }
        else
            system("cls");
        printf("\t\t---------------------------------------------------------\n");
        printf("\t\t|\t\t\t%s\t\t\t|\n", sz_pfad);
        printf("\t\t---------------------------------------------------------\n\n");
        fseek(pfile, 0,SEEK_END);
        ullaenge = ftell(pfile);
        printf("\nDateigroesse = %lu bytes \n", ullaenge);
        id3auslesen(pfile);
        fclose(pfile);
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                  Menüpunkt speichern                          //
    //---------------------------------------------------------------//
    
    int speichern()
    {
        printf("\nSpeichern");
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                  Menüpunkt suchen                             //
    //---------------------------------------------------------------//
    
    int suchen()
    {
        printf("\nSuchen");
        return 0;
    }
    
    //---------------------------------------------------------------//
    //                  Menüpunkt löschen                            //
    //---------------------------------------------------------------//
    
    int loeschen()
    {
        printf("\nLoeschen");
        return 0;
    }
    
    //---------------------------------------------------------------//
    //          Eingabe überprüfen, um Fehler abzufangen             //
    //---------------------------------------------------------------//
    
    int eingabe_pruefen(char c_eingabe)
    {
        if (c_eingabe < 48 || c_eingabe > 57)
            return 0;
        else
            return (int)c_eingabe;
    }
    
    //---------------------------------------------------------------//
    //          Eingabe auswerten, um Fehler abzufangen              //
    //              bzw. Menüpunkt auszuwählen                       //
    //---------------------------------------------------------------//
    
    int eingabe_auswerten(void)
    {
        int i_auswahl, i_exit = 0;
        char c_auswahl;
        while(i_exit==0)
        {
            printf("\nBitte waehlen Sie einen Menu-Punkt (zurueck zum Menu mit 3): ");
            scanf("%c", &c_auswahl);
            if (c_auswahl > 33)
            {
            i_auswahl = eingabe_pruefen(c_auswahl)-48;
            switch(i_auswahl)
            {
            case 1:
                neu();
                break;
            case 2:
                laden();
                break;
            case 3:
                menu_ausgeben();
                break;
            case 4:
                speichern();
                break;
            case 5:
                suchen();
                break;
            case 6:
                loeschen();
                break;
            case 7:
                printf("\nProgramm wurde beendet\n");
                i_exit=1;
                break;
            default:
                printf("Auswahl nicht definiert\n");
                break;
            }
            scanf("%c", &c_auswahl);
            }
    
        }
            return 0;
    }
    
    //---------------------------------------------------------------//
    //          ID3-TAGs aus mp3-Datei auslensen und ausgeben        //
    //---------------------------------------------------------------//
    
    int id3auslesen(FILE *pfile)
    {
        struct id3
        {
            char sz_titel[31];
            char sz_interpret[31];
            char sz_album[31];
            char i_jahr;
            char sz_kommentar[31];
            int i_genre;
        }mp3;
    
        fseek(pfile, -125 ,SEEK_END);
        fread(&mp3.sz_titel ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.sz_interpret ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.sz_album , 30 , 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.i_jahr , 4 , 1, pfile);
        fseek(pfile, 4 ,SEEK_CUR);
        fread(&mp3.sz_kommentar ,30, 1, pfile);
        fseek(pfile, 30 ,SEEK_CUR);
        fread(&mp3.i_genre ,1, 1, pfile);
    
        printf("\nTitel: %s", mp3.sz_titel);
        printf("\nInterpret: %s",mp3.sz_interpret);
        printf("\nAlbum: %s",mp3.sz_album);
        printf("\nErscheinungsjahr: %i",mp3.i_jahr);
        printf("\nKommentar: %s",mp3.sz_kommentar);
        printf("\nGenre: %i\n\n",mp3.i_genre);
        return 0;
    }
    

    vielen Dank



  • Ich hab sowas selber mal geschrieben, allerdings in c++, wird aber kaum nen unterschied machen. hier mal der wichtige code. Sorry wenn der Stil ein bissl shit ist.

    ofstream File(pstrFile,0x20/*nocreate*/ | ios::binary | ios::in);
    
        char strBuffer[129];
        File.seekg ( -128, ios::end );
        File.read ( strBuffer, 128 );   
    
        File.close();
    
        if(strBuffer[0] != 'T' || strBuffer[1] != 'A' || strBuffer[2] != 'G')       // Checken ob es sich um echte ID3-Tags handelt
            return SCAN_NOTAGS;
    
        int j=0,i=0;
    
        // Titel parsen OFFSET 3 - 33
        for(i=3,j=0;i<33;++i,++j)
        {
    
            if(strBuffer[i]=='\0')
                break;
            v1Tags.title[j] = strBuffer[i];
        }
        v1Tags.title[j]='\0';
    
        // Künstler parsen OFFSET 33 - 63
        for(i=33,j=0;i<63;++i,++j)
        {
            if(strBuffer[i]=='\0')
                break;
            v1Tags.artist[j] = strBuffer[i];
        }
        v1Tags.artist[j]='\0';
    
        // Album parsen OFFSET 63 - 93
        for(i=63,j=0;i<93;++i,++j)
        {
            if(strBuffer[i]=='\0')
                break;
            v1Tags.album[j] = strBuffer[i];
        }
        v1Tags.album[j]='\0';
    
        char strYearbuffer[5];
        // Jahr parsen OFFSET 93 - 97
        for(i=93,j=0;i<97;++i,++j)
        {
            if(strBuffer[i]=='\0')
                break;
            strYearbuffer[j] = strBuffer[i];
        }
        strYearbuffer[j]='\0';
        v1Tags.year = atoi(strYearbuffer);
    
        // Kommentar parsen OFFSET 97 - 125
        for(i=97,j=0;i<125;++i,++j)
        {
            if(strBuffer[i]=='\0')
                break;
            v1Tags.comment[j] = strBuffer[i];
        }
        v1Tags.comment[j]='\0';
    
        // Tracknummer parsen OFFSET 126
        v1Tags.track = (int)(unsigned char)strBuffer[126];
    
        // Genre parsen OFFSET 127
        v1Tags.genre = AssignGenre((unsigned char)strBuffer[127]);
    

    Hier die Struktur:

    struct ID3v1
    {
        char    title[31];
        char    artist[31];
        char    album[31];
        int     year;
        char    comment[29];
        int     track;
        string  genre;
    };
    

    Damit du dir nnicht die Menge arbeit mit den Genre-Strings machen musst, poste ich sie mal hier.

    string CID3::strGenreStrings[] =
    {
            "Blues",
            "Classic Rock",
            "Country",
            "Dance",
            "Disco",
            "Funk",
            "Grunge",
            "Hip-Hop",
            "Jazz",
            "Metal",
            "New Age",
            "Oldies",
            "Other",
            "Pop",
            "R&B",
            "Rap",
            "Reggae",
            "Rock",
            "Techno",
            "Industrial",
            "Alternative",
            "Ska",
            "Death Metal",
            "Pranks",
            "Soundtrack",
            "Euro-Techno",
            "Ambient",
            "Trip-Hop",
            "Vocal",
            "Jazz+Funk",
            "Fusion",
            "Trance",
            "Classical",
            "Instrumental",
            "Acid",
            "House",
            "Game",
            "Sound Clip",
            "Gospel",
            "Noise",
            "Alternative Rock",
            "Bass",
            "<UNUSED>",
            "Punk",
            "Space",
            "Meditative",
            "Instrumental Pop",
            "Instrumental Rock",
            "Ethnic",
            "Gothic",
            "Darkwave",
            "Techno-Industrial",
            "Electronic",
            "Pop-Folk",
            "Eurodance",
            "Dream",
            "Southern Rock",
            "Comedy",
            "Cult",
            "Gangsta",
            "Top 40",
            "Christian Rap",
            "Pop/Funk",
            "Jungle",
            "Native US",
            "Cabaret",
            "New Wave",
            "Psychadelic",
            "Rave",
            "Showtunes",
            "Trailer",
            "Lo-Fi",
            "Tribal",
            "Acid Punk",
            "Acid Jazz",
            "Polka",
            "Retro",
            "Musical",
            "Rock & Roll",
            "Hard Rock",
            "Folk",
            "Folk-Rock",
            "National Folk",
            "Swing",
            "Fast Fusion",
            "Bebob",
            "Latin",
            "Revival",
            "Celtic",
            "Bluegrass",
            "Avantgarde",
            "Gothic Rock",
            "Progressive Rock",
            "Psychedelic Rock",
            "Symphonic Rock",
            "Slow Rock",
            "Big Band",
            "Chorus",
            "Easy Listening",
            "Acoustic",
            "Humour",
            "Speech",
            "Chanson",
            "Opera",
            "Chamber Music",
            "Sonata",
            "Symphony",
            "Booty Bass",
            "Primus",
            "Porn Groove",
            "Satire",
            "Slow Jam",
            "Club",
            "Tango",
            "Samba",
            "Folklore",
            "Ballad",
            "Power Ballad",
            "Rhytmic Soul",
            "Freestyle",
            "Duet",
            "Punk Rock",
            "Drum Solo",
            "Acapella",
            "Euro-House",
            "Dance Hall",
            "Goa",
            "Drum & Bass",
            "Club-House",
            "Hardcore",
            "Terror",
            "Indie",
            "BritPop",
            "Negerpunk",
            "Polsk Punk",
            "Beat",
            "Christian Gangsta",
            "Heavy Metal",
            "Black Metal",
            "Crossover",
            "Contemporary C",
            "Christian Rock",
            "Merengue",
            "Salsa",
            "Thrash Metal",
            "Anime",
            "JPop",
            "SynthPop"
        };
    

    FAlss du auch ID3v2 Tags bearbeiten wirst, würde mich das sehr interessieren, denn das krieg ich nicht zusammen. Falls du das machst: [email] michiludwig@gmx.de [/email]



  • ahhh.
    du darfst nach dem read( ... pfile)
    kein fseek machen, da fseek den lese zeiger automatisch mitbewegt.
    lies das jahr als char[4] (bzw char[5] fuers '\0' am ende) ein und gib es aus.
    (du hast in deinem printf fuers jahr immer noch %i stehen).
    dann funzt es :).



  • Hat es dir weitergeholfen



  • es hat mir alles etwas geholfen. deins hat mir zwar vom Code her nicht geholfen(da c++), dafür aber hat es mir gezeigt, wie ich mein Problem mit dem Auslesen des TAGs lösen kann.

    Dafür allen DANKE

    mfg

    Bernd


Anmelden zum Antworten