3

我开始为 Android 实现 Oboe c++ 库。(根据使用双簧管构建音乐游戏, 我只是缩放样本以增加音量,它可以工作,但会发出噼啪声。我可以增加幅度而不会产生噼啪声吗?我试图用一点增益来保存我的样本声音,但是听起来很糟糕。谢谢。

顺便说一句,在不增加音量的情况下,与其他音乐应用程序相比,它听起来清晰但音量非常低。

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;
};
4

1 回答 1

0

您发布的代码来自Mixer::renderAudio(int16_t *audioData, int32_t numFrames). 它的工作是将来自各个轨道的样本值混合到一个 16 位样本数组中。

如果您将 2 个或更多轨道混合在一起而不先减小值,那么您可能会超过 32,767(又名INT16_MAX)的最大样本值。这样做会导致回绕(即,将 32,768 写入 anint16_t将导致值 -32,768 被存储),因此会出现失真/噼啪声。

考虑到这一点,您可以编写一个非常基本的(硬)限制器 - 使用 an 进行音量缩放,如果值不超过最大值,则仅将int32_t其写入数组,否则只需写入最大值。int16_t

不过,这并不是一个真正的好方法,因为您不应该达到 16 位值的限制。最好先按比例缩小输入样本值,然后在混音器之后(或在混音器内的各个轨道上)添加增益级,以将整体幅度提高到可接受的水平。

于 2018-12-12T17:31:50.117 回答