Depuis quelque jour, j'essaye de convertir un fichier .wav en mp3
Pour cela j'utilise LAME.
J'arrive a convertir le fichier en passant par l'invite de commande avec cette commande:
lame.exe -b128 --resample 8 -m j \"C:\\test.wav\" \"C:\\test.mp3\"

Mais imposible en C++ (en passant par la librairie LAME)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
int main()
{
    //...
    //...
    // extraction de données audio PCM du fichier .wav  dans un fichier file.pcm
    short read, write;
 
    FILE *pcm = fopen("file.pcm", "rb");    //PCM du fichier .wav
    FILE *mp3 = fopen("file.mp3", "wb");
 
    const int PCM_SIZE = 18424;
    const int MP3_SIZE = 13424;
 
    short int pcm_buffer[PCM_SIZE];       //PCM du fichier .wav
    unsigned char mp3_buffer[MP3_SIZE];
 
    lame_t lame = lame_init();
 
   if ( lame == NULL ) {
        cout<<"Unable to initialize MP3"<<endl;
        return -1;
    }
 
    lame_set_num_channels(lame, 1);
    lame_set_in_samplerate(lame, 8000);
    lame_set_out_samplerate(lame, 8000);
    lame_set_brate(lame, 128);
    lame_set_mode(lame, MONO);
    lame_set_quality(lame, 2);
    lame_set_bWriteVbrTag(lame, 0);
    if (( lame_init_params(lame)) < 0) {
        cout << "Unable to initialize MP3 parameters"<<endl;
        return -1;
    }
 
    do {
        read = fread(pcm_buffer,sizeof(short), PCM_SIZE, pcm);
        if (read == 0)
            write = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
        else
            write = lame_encode_buffer_interleaved(lame, pcm_buffer, read, mp3_buffer, MP3_SIZE);
        fwrite(mp3_buffer, write, 1, mp3);
    } while (read != 0);
 
    lame_close(lame);
    fclose(mp3);
    fclose(pcm);
 
    return 0;
}
Le fichier obtenu est mon fichier audio mais en tres movaise qualité.


Des idées pour reglé le probleme ?


Voici les info de mon .wav :
Frequence: 8000
BlocSize: 16
NbrCanaux: 1 (mono)
BytePerSec: 16000
BytePerBloc: 2
BitsPerSample: 16

Merci


Edit:
J'aimerais donc ne pas passer par une ligne de commande (pour la portabilité entre OS)