Comment récupérer la durée d'un MP3?

house_flju Messages postés 1 Date d'inscription samedi 6 décembre 2003 Statut Membre Dernière intervention 13 décembre 2003 - 13 déc. 2003 à 10:29
cs_gorgonzola Messages postés 37 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 21 février 2015 - 4 janv. 2004 à 15:44
Bonjour!

Voila j'aimerai recuperer la durée desp3 assez simplement pour un petit programme qui me listerai mes MP3 au format HTML

Merci d'avence à ceux qui essayeront de me repondre!

2 réponses

cs_othland Messages postés 298 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 9 février 2010 1
29 déc. 2003 à 16:37
tu veux dire quoi par recuperer la durée, j'ai pas compris???
tu peux pas l'avoir dans le media-player???
0
cs_gorgonzola Messages postés 37 Date d'inscription samedi 16 mars 2002 Statut Membre Dernière intervention 21 février 2015
4 janv. 2004 à 15:44
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.
0
Rejoignez-nous