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?
Not sure if you are still looking for an answer other than Dave L's, but the click noise is coming from LAME accidentally encoding the header in the audio file. Depending on the WAV file you are producing, the header would probably be 44 bytes. I ran into a similar issue when converting PCM files that I recorded, but those headers are 4096 bytes in my case. If it is a true wav file (and thus has the 44 byte header) just use
fseek(pcm,44,0);
Right after you open the file to skip over the header stuff. I also recommend using a Hex editor on one of your WAV files to verify the size of the header.
Once I skipped over that (again, my headers were 4096b), the clicking noise disappeared.
Any luck solving this issue?
I've been having a similar problem and I tried just skipping the first 1024 bytes when writing to the output file (i.e., I’m just discarding those bytes before I start to write the output from LAME to the output file). This eliminated the “click” at the beginning of the recording but it’s a bit of a hack, but seems to work okay.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With