gpt4 book ai didi

c++ - 将 pcm 转换为 mp3(使用 LAME)导致 mp3 文件中出现 "clicks"

转载 作者:行者123 更新时间:2023-11-30 04:28:12 29 4
gpt4 key购买 nike

我的应用使用 LAME 将原始 pcm 数据编码为 mp3。但我有一个问题 - 输出 mp3 在持续的一段时间内包含“点击”。类似的东西:

声音...“咔哒”声...“咔哒”声...“咔哒”声等...

我尝试了不同版本的 LAME 并尝试更改许多 LAME 设置但没有成功。我的应用程序还可以将 pcm 转换为 wav 和 ogg,但此转换器不会导致“点击”。

有一个编码代码(pcm输入包含一个 channel 数据,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;

最佳答案

Sound -> Click -> Sound -> Click 模式很可能意味着您一次只写入缓冲区的一半,而另一半在 Write 调用中的每个循环中保持为零。

原因是您的循环增量器基于 dwSamples*2 的 dwMP3Buffer 值。

 for(int curPos = 0; curPos < _size; curPos += dwMP3Buffer){

这意味着您实际上并未对所有输入值进行编码,因为 dwMP3Buffer 是您实际传递给 lame_encode_buffer 调用 (dwSamples) 的样本数量的两倍。

lame_encode_buffer(lame, (short *)((char *)_data + curPos), 
(short *)((char *)_data + curPos), dwSamples, pMP3Buffer, 0);

尝试将循环增量器更改为以下内容:

 for(int curPos = 0; curPos < _size; curPos += dwSamples){

关于c++ - 将 pcm 转换为 mp3(使用 LAME)导致 mp3 文件中出现 "clicks",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10345064/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com