C'est un peu compliqué mais j'ai fini par trouver comment faire (je suis moi aussi en trainn de faire un programme dans le même genre que le tien).
Bon un mp3 est composé de plusieurs frames, et chaque frame à un en-tête de 4 octets. Les 12 premiers bits sont toujours mis à 1 (permet de reconnaitre l'en-tête), ensuite viennent 4 bits qui donnent la version du mp3, ensuite 4 autres bits (on est donc dans le troisième octet) qui donnent le bitrate (comme 128kbps, 192kbps,...).
Alors moi pour récupérer la durée j'ai fait une fonction qui recherche le bitrate du mp3 et ensuite calcule la durée d'après la taille du mp3 (normalement ce n'est pas comme cela qu'on fait, donc il y a souvent quelques secondes de plus ou de moins). J'ai aussi remarqué que parfois il tombait sur un bitrate erroné, dans ce cas-ci je vais seulement à la frame suivante sans me poser de questions.
Voici le code de ma fonction, ça met le bitrate (en kbps) dans
b et la durée (en secondes) dans
s,
name est le nom du fichier :
void mp3Infos(char* name,int* b,int* s) { long size; unsigned char c; FILE* file;
/* ouvre le mp3 */ file=fopen(name,"rb");
/* boucle pour trouver le bitrate */ do { do { /* cherche un octet dont tous */ /* les bits sont positifs */ do { c=fgetc(file); } while (c!=0xFF);
/* lit un second octet */ c=fgetc(file);
/* sort de la boucle si les 4 premiers bits sont positifs */ } while ((c&0xF0)!=0xF0);
/* lit les 4 premiers bits de l'octet suivant */ c=(fgetc(file)&0xF0)>>4;
/* regarde a quel bitrate les 4 bits correspondent */ *b=bitrate[c];
/* recommence si on a un bitrate erronee */ } while ((*b==0)||(*b==999));
/* va a la fin du mp3 */ fseek(file,0,SEEK_END);
/* recupere la position (donc la taille du mp3) */ size=ftell(file);
/* ferme le mp3 */ fclose(file);
/* calcule la duree d'apres le bitrate et la taille du fichier */ *s=(size/((*b)<<7));
/* attention la duree obtenue est aproximative ! */ }
|
Attention ça ne marche que pour les mp3 avec bitrate constant. Pour les mp3 VBR ça donne des valeurs fantaisistes.