我有一个程序,我从麦克风24/7录制一个1.5秒的音频缓冲区。 现在,不是将缓冲区(根本没有声音)发送到服务器,这只会使它更加滞后并浪费带宽,我想检查缓冲区是否有声音。
缓冲区如下所示:
short int *waveIn = new short int[NUMPTS];
其中:
const double seconds = 1;
const int sampleRate = 8000;
const int NUMPTS = sampleRate * seconds;
所以,我有一个包含8000个单元的短整数,它存储音频缓冲区......
现在,通过使用Visual Studio调试器进行检查,在我将麦克风音频捕获到缓冲区后,缓冲区如下所示:
waveIn[0] = -125
waveIn[1] = -780;
waveIn[2] = -1320;
依旧......
现在,我需要使用此缓冲区检测,如果它已捕获音频,或者它只是一个不包含声音的缓冲区...
运行几次之后,我注意到当缓冲区里面有声音时,单元格包含较小的数字。例如,其中包含声音的数组通常如下所示:
waveIn[0] = -1300;
waveIn[1] = -3200;
waveIn[2] = -2400;
现在,我的问题是,有时候,包含音频的缓冲区有大数字(更接近0),即使它们内部有声音......
因此,例如,有时单元格的数字范围为-600~-1200且内部没有任何内容,有时,它们的数字范围为-600~1200,实际上内部包含声音。
那么,我怎样才能检测到音频缓冲区内部是否有声音?
我希望我足够清楚......
谢谢!
编辑:我忘了提及,我正在使用Wave API处理音频...
答案 0 :(得分:2)
假设您正在使用WAVE_FORMAT_PCM,单个样本的范围可以在32K到-32K之间,静音是接近0的小数。要计算声音的大小,您应该采用多个样本的绝对值(正样本和负样本)同样重要),然后平均。仅查看3个样本是非常不合适的(只有3/8000秒),因此选择与真实声音相当的间隔,例如十分之几秒。没有神奇的幅度阈值意味着存在声音,因此更好的策略是比较连续间隔的幅度,甚至是运行平均值,寻找从低(近 - 安静)到高得多(更响亮)的变化。因此,您将根据背景噪音水平获得移动阈值。