android - 增加双簧管音量后如何避免噼啪声?

标签 android oboe

我开始为 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/

相关文章:

android - 在Android中切换Activity时的动画?

android如何在jpeg上创建鱼眼效果

android - 在 Android NDK 中构建图形 UI

c++ - 双簧管异步音频提取

android - 什么可能会改变声音输出

android - 闹钟没有唤醒手机

java - Java 编译器会优化对最终静态变量的方法调用吗?当它变成 dalvik 代码时会发生什么?

java - 在 Android 中实现单用户 OAuth

android - 与android ndk混合后是否可以访问音频输出流?

c++ - Oboe C++ 线程——如何在不阻塞的情况下读取和写入队列