繁体   English   中英

检查音频缓冲区中的声音

[英]Checking Audio buffer for sound

我有一个程序,要在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个单元的short int数组,用于存储音频缓冲区...

现在,通过使用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来处理音频...

假设您使用的是WAVE_FORMAT_PCM,则各个样本的范围可以在32K到-32K之间,而静音是接近0的小数字。要计算声音的大小,您应该采用许多样本的绝对值(正样本和负样本同等重要) ),然后取平均值。 仅查看3个样本是远远不够的(仅为3/8000秒),因此请选择与真实声音相当的间隔,例如十分之几秒。 没有魔幻的幅度阈值表示存在声音,因此更好的策略是比较连续间隔的幅度,甚至是移动平均值,以寻找从低(近乎安静)到实质上较高(更大声)的变化。 因此,您将有一个基于背景噪声水平的移动阈值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM