Forum Programmation.c++ Conversion en mp3 avec libmp3lame

Posté par  . Licence CC By‑SA.
Étiquettes :
0
12
juin
2013

Salut,

Alors voilà, je suis en train d'essayer de comprendre comment marche la librairie lame pour encoder en mp3, le tout à partir d'un prog C++

Lame est assez mal documenté, j'ai un truc qui compile, qui parfois veut bien tourner (en jouant avec les params) mais clairement pas quelques chose qui marche, à prioris je dois pas comprendre la fonction : 

int lame_encode_buffer_interleaved  (   lame_global_flags *     gfp,short int   buffer[],int    nsamples,unsigned char *  mp3buf,   int     mp3buf_size)    

Voilà comment j'éssaye de l'utiliser,

 //Je vous épargne la lecture du header du wav, et ce genre de truc 
 while (inStream) {
 inStream.read(WavBuff,WavBufferSize);
 cout << "read : " << inStream.gcount() << endl;
 int PCMBuffSize=WavBufferSize/(sizeof(short int)/sizeof(char));
 cout << PCMBuffSize << endl;
 short int* PCMBuff /*= new short int[PCMBuffSize]*/;
 int MP3BuffSize=(1.25*PCMBuffSize+7200); // Magic numbers from lame.h 
 unsigned char* MP3Buff = new  unsigned char[MP3BuffSize];
 //Conversion char* from read to short int
 PCMBuff=reinterpret_cast<short int*>(WavBuff);
 lame_encode_buffer_interleaved(lame, PCMBuff,WavBufferSize,MP3Buff, MP3BuffSize);

if (!inStream) {
    lame_encode_flush(lame, MP3Buff,MP3BuffSize);
  }
//Et puis on écrit le buffer avec le mp3
outStream.write((char*)MP3Buff,PCMBuffSize);
delete[] MP3Buff;

}
inStream.close();

Allons y pour les questions,
* Comment je connais la taille du buffer qui contiens mon mp3, je veux dire après encodage, pour savoir combien de bit je doit écrire ? Car je m'en sort avec un fichier trop long entrecoupé de blancs
* Est-ce que avoir seté : lame_set_num_channels(lame,channels); me garantit que lame sait faire la différence tout seul entre du mono et du stéréo ? Car je soupçonne qu'un de mes problèmes y soit liés
* Je veux lire mon tableau de char comme un tableau de short (input de la fonction) est-ce que int PCMBuffSize=WavBufferSize/(sizeof(short int)/sizeof(char)); me donne la bonne taille, est-ce qu'un simple ré-interpret cast est bon (je pense que oui, vu ce que me dit la calculatrice et l'éditeur hexa)

Voilà pour la première séries de questions, si quelqu'un à l'habitude

  • # Auto-réponse

    Posté par  . Évalué à 1.

    Je m'auto-répond ça pourra peut-être aider quelqu'n

    • lame_encode_buffer retourne la taille du mp3 c'est donc ça qu'il faut écrire

    • lame_encode_buffer_interleaved assume que les données son stéréo, pour du mono il faut prendre la variante qui à des buffer L/R séparés et mettre les même dedans lame_encode_buffer Si il y a plusieurs chan le WavBufferChan doit être divisé par le nombre de channels

    +Je confirme que la lecture d'un wav est simple les 44 premiers bytes sont le header, et ensuite on a directement le PCM 

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.