我的應用程序使用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