【问题标题】:Checking Audio buffer for sound检查音频缓冲区的声音
【发布时间】:2014-04-12 10:15:09
【问题描述】:

我有一个程序,我正在从麦克风录制 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 来处理音频...

【问题讨论】:

    标签: c++ winapi voip


    【解决方案1】:

    假设您使用的是 WAVE_FORMAT_PCM,则单个样本的范围可以在 32K 和 -32K 之间,静音是接近 0 的小数字。要计算声音的幅度,您应该取多个样本(正样本和负样本)的绝对值同等重要),然后平均它们。仅查看 3 个样本是非常不够的(仅 3/8000 秒),因此请选择与真实声音相当的间隔,例如十分之几秒。不存在意味着声音存在的神奇幅度阈值,因此更好的策略是比较连续间隔的幅度,甚至是运行平均值,寻找从低(接近安静)到显着更高(更大声)的变化。因此,您将有一个基于背景噪声级别的移动阈值。

    【讨论】:

    • 是的,我正在使用 WAVE_FORMAT_PCM。所以,我需要对数组单元进行平均,然后呢?看看每个单元格是否离平均值太远?我真的不明白达到平均水平后我需要做什么......
    • 如果“细胞”是指一个单独的样本,那么不,不要比较它们。他们非常不稳定。只看平均幅度。当它们突然升起时,那是声音的开始。如果您在音频编辑器(如 CoolEdit)中检查 WAV 文件,您会更好地了解这些数据的外观。
    • 所以如果我可以让它更容易理解,你会说这样的话:获取数组的平均值。如果它小于 X(例如,X 可能是 -800),则它是一个好数据包。否则,它是一个坏包。这是你说的吗?
    • 你在平均之前取样本的绝对值了吗?这不可能是负值。而且我不知道您所说的“好”和“坏”数据包是什么意思。
    • 好的,我没有尝试过,因为我没有完全理解你的意思。让我更好地解释一下:1)好的数据包=一个带有声音的缓冲区。坏数据包 = 一个没有声音的缓冲区,只是无效(比如,沉默,因为我没有对着麦克风说话,而且我的房间里也完全没有声音)。 2)如果我理解正确,我需要:使用数组的绝对值创建一个平均值,然后检查平均值是否大于 X?如果是,那么它是一个“好包”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多