当 Superpowered Reverb 与 Audio Graph 一起使用时,处理的音频非常嘈杂

Posted

技术标签:

【中文标题】当 Superpowered Reverb 与 Audio Graph 一起使用时,处理的音频非常嘈杂【英文标题】:Processed audio very noisy when Superpowered Reverb used with Audio Graph 【发布时间】:2017-07-19 22:03:18 【问题描述】:

我在 OS X 上使用带有 Audio Graph 的 Superpowered Reverb 效果。 我通过在输出音频单元的渲染回调中调用reverb->process 来做到这一点(在kAudioUnitSubType_SystemOutputkAudioUnitSubType_DefaultOutput 上测试)。

混响效果有效,但产生的音频非常嘈杂。我尝试了不同的方法(调整采样率、使用额外和归零的缓冲区等),但似乎没有帮助。有没有办法解决这个问题?谢谢。

简化代码:

SuperpoweredReverb* reverb;

OSStatus callback(void * inComponentStorage,
                  AudioUnitRenderActionFlags * __nullable flags,
                  const AudioTimeStamp * inTimeStamp,
                  UInt32 busNumber,
                  UInt32 framesCount,
                  AudioBufferList * ioData)

    for (int i = 0; i < ioData->mNumberBuffers; ++i)
    
        if (ioData->mBuffers[i].mData)
            reverb->process(static_cast<float*>(ioData->mBuffers[i].mData),
                            static_cast<float*>(ioData->mBuffers[i].mData),
                            framesCount);
    

    return noErr;


void setupReverb(unsigned int sampleRate, AudioUnit unit)

    reverb = new SuperpoweredReverb(sampleRate);
    reverb->enable(true);
    reverb->setMix(0.5);
    AudioUnitAddRenderNotify(unit, callback, nullptr);

【问题讨论】:

【参考方案1】:

事实证明,在音频图中,即使在同一个频道上,回调也会多次调用,我做了以下更改(使用整数来跟踪当前频道),现在它工作得非常好。 (下面再次简化代码)

SuperpoweredReverb* reverbUnit;
int spliter = 0;

OSStatus callback(void * inComponentStorage,
                  AudioUnitRenderActionFlags * __nullable flags,
                  const AudioTimeStamp * inTimeStamp,
                  UInt32 busNumber,
                  UInt32 framesCount,
                  AudioBufferList * ioData)

    spliter++;
    for (int i = 0; i < ioData->mNumberBuffers; ++i)
    
        if (ioData->mBuffers[i].mData) 
            if (!(spliter % ioData->mBuffers[i].mNumberChannels))
                reverbUnit->process(static_cast<float*>(ioData->mBuffers[i].mData),
                                    static_cast<float*>(ioData->mBuffers[i].mData),
                                    framesCount);
        
    

    return noErr;


void setupReverb(unsigned int sampleRate, AudioUnit unit)

    reverbUnit = new SuperpoweredReverb(sampleRate);
    reverbUnit->enable(true);
    reverbUnit->setWet(0.7);
    AudioUnitAddRenderNotify(unit, callback, nullptr);

【讨论】:

以上是关于当 Superpowered Reverb 与 Audio Graph 一起使用时,处理的音频非常嘈杂的主要内容,如果未能解决你的问题,请参考以下文章

解释来自 Superpowered CrossExample for Android 的 C++ 代码

使用 NDK 构建 Superpowered 时 Android Studio ExternalSystemException 错误

通过 BPM 将音轨分割成片段,并使用 Superpowered iOS 分析每个片段

音效处理Reverb 混响算法简介

音效处理Reverb 混响算法简介

vs插件 都有哪些?推荐一下