如何在每个Update()-Frame切换Audiosource的音量时避免音频毛刺?

时间:2019-02-21 18:24:32

标签: c# unity3d volume audio-source

我正在开发一种可同时播放64个音频源的音频工具。因此,我创建了四个数组,每个数组包含16个音频源。每个音频源阵列都被路由到其自己的混音器。此外,两个混音器输出到左声道,两个在右声道。我的DSP缓冲区大小设置为“最佳性能”,这意味着1024个样本,并且有足够的真实/虚拟声音可用。

开始时,将60个音频源设置为Volume = 0,而其中四个在Volume = 0.5的情况下运行。在每个Update()帧中,我将播放0.5的那些音频的音量设置为零,因此将之前为零的四个新音频源设置为0.5。

类似这样的东西:

void SwitchSources()
 {
     noseposInd++;
     if (noseposInd > 15) noseposInd = 0;

     audioSources_Lm[noseposIndTemp].volume = 0.0f;
     audioSources_Ln[noseposIndTemp].volume = 0.0f;
     audioSources_Rm[noseposIndTemp].volume = 0.0f;
     audioSources_Rn[noseposIndTemp].volume = 0.0f;

     audioSources_Lm[noseposInd].volume = 0.5f;
     audioSources_Ln[noseposInd].volume = 0.5f;
     audioSources_Rm[noseposInd].volume = 0.5f;
     audioSources_Rn[noseposInd].volume = 0.5f;

     noseposIndTemp = noseposInd;
}

出于测试目的,我将f = 2Hz(导致每秒听得见的咔嗒声)的矩形信号加载到每个Audiosource中。使用Audacity记录我的输出结果会在所附照片中看到一些东西:

enter image description here

似乎四个信号之一的缓冲区没有写入输出,因为与正脉冲或负脉冲有关的幅度仅为一半。 “缺口”的宽度恰好是一个块长。意味着有1024个采样,采样率为44.1kHz,因此23ms左右没有输出。

增加音量的变化率也会增加陷波次数/超时的发生,但是这可以被称为。有人遇到过同样的问题吗?或者可以提供一些有关Update()方法和混频器的音频块编写方式如何产生干扰的知识吗?

谢谢!

0 个答案:

没有答案