我的应用程序使用LAME将原始pcm数据编码为mp3。但我有一个问题 - 输出的MP3包含持续一段时间的“点击”。类似的东西:将pcm转换为mp3(使用LAME)会在mp3文件中产生“点击”
声音......“咔嚓”的声音。“咔嚓”一声..“点击”等...
我已经试过LAME的不同版本,并试图改变许多LAME设置,但不成功。我的应用程序也可以将pcm转换为wav和ogg,但这种转换器不会导致“点击”。
有一个编码代码(PCM输入包含一个信道的数据,PCM已经重新采样到44100 FREQ):
初始化:
lame = lame_init();
lame_set_in_samplerate(lame, 44100);
lame_set_VBR(lame, vbr_abr);//vbr_default
lame_init_params(lame);
//Samples count (do not have any effect on output)
dwSamples=1024;
//mp3 buffer size, if it do not equals dwSamples*2 than output sound getting scaled
dwMP3Buffer=dwSamples*2;
pMP3Buffer = new BYTE[dwMP3Buffer];
书写PCM数据
int Mp3Stream :: Write(short * _data, int _size)
{
if (_size > 0)
{
for(int curPos = 0; curPos < _size; curPos += dwMP3Buffer)
{
//int size = dwMP3Buffer;
//if (_size - curPos < dwMP3Buffer)
// size = _size - curPos;
int bytes = lame_encode_buffer(lame, (short *)((char *)_data + curPos), (short *)((char *)_data + curPos), dwSamples, pMP3Buffer, 0);
IPF_TRACE(1, "MP3 encoder wrote "<<bytes<<" bytes");
if (bytes<0)
{
IPF_TRACE(1, "MP3 encoding failed with code "<<bytes);
return bytes;
}
BOOL bResult = WriteFile(hFile, pMP3Buffer, bytes, &bw, NULL);
if (!bResult || bytes != bw)
{
IPF_TRACE(1, "MP3 write to file failed with code "<<bytes);
}
};
}
}
敲定
int bytes = lame_encode_flush(lame, pMP3Buffer, 0);
if (bytes<0)
{
IPF_TRACE(1, "MP3 flush failed with code "<<bytes);
}
BOOL bResult = WriteFile(hFile, pMP3Buffer, bytes, &bw, NULL);
if (!bResult || bytes != bw)
{
IPF_TRACE(1, "MP3 write to file failed with code "<<bytes);
}
int ret = lame_close(lame);
if (ret < 0)
{
IPF_TRACE(1, "MP3 lame close failed with code "<<ret);
}
delete []pMP3Buffer;
我有同样的问题和解决方案在这里:http://stackoverflow.com/questions/13277042/clicks-while -using-lame-to-encode-from-pcm-to-mp3-in-ios – Jeff 2016-01-27 22:49:45