I'm using LAME to convert a WAV file (extracted from Audio CD) into MP3. The conversion result is just fine except at the very beginning of the file there is one single "click" sound. The click takes almost 0.5 second prior to the song itself.
char *input_file = argv[1];
char *output_file = argv[2];
FILE *pcm = fopen(input_file, "rb");
FILE *mp3 = fopen(output_file, "wb+");
size_t nread;
int ret, nwrite;
const int PCM_SIZE = 1152;
const int MP3_SIZE = 1152;
short pcm_buffer[PCM_SIZE * 2];
unsigned char mp3_buffer[MP3_SIZE];
lame_t lame = lame_init();
// Can not put these lines at the end of conversion
id3tag_set_title(lame, "Still reminds me");
id3tag_set_artist(lame, "Anggun");
lame_set_VBR(lame, vbr_mt);
lame_set_VBR_quality(lame, 2);
ret = lame_init_params(lame);
do {
nread = fread(pcm_buffer, sizeof(short), PCM_SIZE * 2, pcm);
if (nread != 0) {
// Is this the cause of the single click?
int nsamples = nread / 2;
short buffer_l[nsamples];
short buffer_r[nsamples];
int j = 0;
int i = 0;
for (i = 0; i < nsamples; i++) {
buffer_l[i] = pcm_buffer[j++];
buffer_r[i] = pcm_buffer[j++];
}
nwrite = lame_encode_buffer(lame, buffer_l, buffer_r, nsamples,
mp3_buffer, MP3_SIZE);
} else {
nwrite = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
}
fwrite(mp3_buffer, nwrite, 1, mp3);
} while (nread != 0);
lame_close(lame);
fclose(mp3);
fclose(pcm);
What's going on? What do I miss here?
nwrite = lame_encode_flush(lame, mp3_buffer, MP3_SIZE);
I failed to flush. Without fseek, the nwrite return >= 0. – Swath