You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重用Oboe的MultiChannelResampler实例并消除起始爆音?

解决Oboe MultiChannelResampler重用时的起始爆音问题

重用resampler::MultiChannelResampler时出现起始爆音,本质是上次使用后残留的内部缓冲数据干扰了新音频的处理。无需新建实例,用以下方法即可解决:

核心方案:调用重采样器的reset()方法

Oboe的Resampler基类(MultiChannelResampler继承自它)提供了reset()虚函数,专门用于清除内部状态:

  • 清空延迟缓冲里的残留音频数据
  • 重置读写指针、插值计算相关的状态变量
  • 让重采样器回到与新实例一致的初始状态

修改代码示例

在每次触发新音符、开始填充新音频数据前,先调用reset():

// 新音符触发时执行重置
resampler->reset();

int outputFramesLeft = numOutputFrames;
while (outputFramesLeft > 0) {
    if(resampler->isWriteNeeded()) {
        const float *frame = getNextInputFrame(); // 获取当前音符的输入帧
        resampler->writeNextFrame(frame);
    } else {
        resampler->readNextFrame(outputBuffer);
        outputBuffer += channelCount;
        outputFramesLeft--;
    }
}

可选优化:中途停止时排空缓冲(非必须)

如果希望停止旧音符时更平滑,避免残留数据积累,可以在松琴键时,向重采样器填充几帧静音数据,直到内部缓冲排空(通过isWriteNeeded()判断是否还需要输入),之后再调用reset()。不过直接调用reset()已经能解决爆音问题,这个步骤是锦上添花。

内容的提问来源于stack exchange,提问作者Gilian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:34:54