我开始为android实现oboe c++库。
(根据Build a Musical Game using Oboe
我只是缩放样品以增加体积,它工作,但爆裂。
我能增加振幅而不引起爆裂声吗?
我试着用一点增益来保存我的示例声音,但听起来很糟糕。
谢谢。
顺便说一句,在不增加音量的情况下,它听起来很清晰,但与其他音乐应用程序相比,音量非常低。
for (int i = 0; i < mNextFreeTrackIndex; ++i) {
mTracks[i]->renderAudio(mixingBuffer, numFrames);
for (int j = 0; j < numFrames * kChannelCount; ++j) {
audioData[j] += (mixingBuffer[j] * ((float)volume));
}
编辑:
int16_t Mixer::hardLimiter(int16_t sample) {
int16_t audioData = sample * volume;
if(audioData >= INT16_MAX){
return INT16_MAX;
}else if(audioData <= INT16_MIN){
return INT16_MIN;
}
return audioData;
};
最佳答案
您发布的代码来自Mixer::renderAudio(int16_t *audioData, int32_t numFrames)
。它的工作是将各个磁道的采样值混合到一个16位采样的数组中。
如果将两个或多个轨迹混合在一起而不先减小值,则可能会超过最大采样值32767(akaINT16_MAX
)。这样做将导致环绕(即,将32768写入int16_t
将导致存储-32768的值),并因此导致声音失真/爆裂。
有鉴于此,您可以编写一个非常基本(硬)的限制器-使用int32_t
进行卷缩放,只有在值不超过最大值时才将其写入int16_t
数组,否则只需写入最大值即可。
不过,这并不是一个很好的方法,因为不应该达到16位值的限制。最好是先缩小输入的采样值,然后在混频器之后添加一个增益级(或在混频器内的各个轨道上),以将整体振幅提高到可接受的水平。
关于android - 如何在双簧管增加音量后避免爆裂的爆裂声?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53674076/