我想增加语音数据缓冲区的音量。重点是我正在使用 DirectSound,并且我有一个主要缓冲区和一个辅助缓冲区 - 所有流混合都是手动完成的。在语音聊天中,所有参与者都可以拥有独立的音量级别。我将每个流数据乘以一个值(增益)并将其求和到一个缓冲区。一切工作正常,但当我尝试将数据乘以大于 1.0f 的值时 - 我听到一些削波或其他声音。
我尝试过使用 Audacity 效果压缩器,但这无助于减少奇怪的噪音。
也许我应该以其他方式修改增益?或者只是使用另一种后处理算法?
更新:哇,我刚刚发现了有趣的事情!我在增加音量之前和之后都转储了音频。
Here is the pic
对于质量感到抱歉 - 我认为这就是声音应该出现的样子(我自己画了红线)。看起来值确实超出了示例数据类型。但我不明白为什么?我的样本缓冲区是字节,但我只能通过短指针访问它。它已签名,但即使 *ptr 约为 15-20,000 时也会发生剪裁。
对于每个样本 - 将其转换为某种更大的数据类型 - 如果您有 16 位有符号样本,它们最初适合 SHORT - 从流中提取它,然后转换为本地双精度,然后乘法,然后 CLIP,然后转换回 SHORT。
它必须这样工作......
如果需要,我什至可以提供代码示例。
EDIT:
你的图片是确切的证据,表明你在乘法之前没有扩展到更大的类型 - 你无法“捕获”SHORT 上的剪切条件,因为它会自动换行。
short* sampleBuffer;
...
short sample=*sampleBuffer;
double dsample=(double)sample * gain;
if (dsample>32767.0) {dsample=32767.0;}
if (dsample<-32768.0) {dsample=-32768.0;}
*sampleBuffer=(short)dsample;
sampleBuffer++;
还有一个编辑:
如果您有多个声音 - 首先将它们全部加倍 - 然后增益每个声音 - 然后添加它们 - 最后一步剪辑它们。
又一个编辑(+1 激励了我):
如果你有 STEREO,同样的东西也可以工作,只需计算所有样本 x2,即
number of shorts
=
number of samples
*
2
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)