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 Mais qui suis-je ? :) . É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.