我开始为 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 位样本数组中。
如果您将 2 个或更多轨道混合在一起而没有先降低值,那么您可能会超过最大样本值 32,767(也称为 INT16_MAX
)。这样做会导致回绕(即,将 32,768 写入 int16_t
将导致存储值 -32,768),因此会出现失真/噼啪声。
考虑到这一点,您可以编写一个非常基本的(硬)限制器 - 使用 int32_t
进行音量缩放,并且仅在以下情况下将其写入 int16_t
数组不超过最大值,否则只写最大值。
但这并不是一个好的方法,因为您不应该达到 16 位值的限制。更好的做法是先按比例缩小您的输入样本值,然后在混音器之后(或混音器内的各个轨道上)添加一个增益级,以使整体振幅达到可接受的水平。
关于android - 增加双簧管音量后如何避免噼啪声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674076/