使用Bass.DLL的简单Babymonitor

时间:2016-10-30 09:51:43

标签: delphi bass bass.dll

我正在尝试编写一个简单的Babymonitor for Windows(个人用途)。 婴儿监视器应该只检测麦克风的dB电平并以一定音量触发。

经过一些研究,我找到了Bass.dll库,并发现了它的函数BASS_ChannelGetLevel,这很好,但似乎有局限性,不符合我的需要(Peak等于DWORD值)。 / p>

在示例中,我找到了一个“几乎”我需要的lifepec示例。该示例使用BASS_ChannelGetData,但我不太清楚如何处理返回的数组...

我希望尽可能简单:从麦克风中检测音量为dB或任何其他值(例如,值0-MAXINT)。

如何使用Bass.dll库完成此操作?

2 个答案:

答案 0 :(得分:3)

BASS_ChannelGetLevel返回上限为0dB的值(在这种情况下返回值为32768)。如果您调整源级别(声卡设置中的麦克风级别较低),那么它将正常工作。

另一种方式,如果你想得到无上限的值是使用BASS_ChannelGetLevelEx函数:它返回浮点级别,其中1是最大(0dB)值,对应于BASS_ChannelGetLevel' 32767,但是它可以超过1来检测超过0dB的声级,这是你可能需要的。

我还建议您暂时监听声级:仅当某个级别至少存在2-3秒时触发(这样您将排除错误警报)。

答案 1 :(得分:1)

以下是给定输入流句柄(streamHandle)获取数据库级别的方法:

var peak = (double)Bass.BASS_ChannelGetLevel(streamHandle);
var decibels = 20 * Math.Log10(peak / Int32.MaxValue);

或者,您可以使用以下方法获取RMS(平均值)峰值。要获取RMS值,您必须将样本长度传递到BASS_ChannelGetLevel。我在这里使用20毫秒,但您可以使用该值来查看最适合您需求的值。

var decibels = 0m;
var channelCount = 2; //Assuming two channels
var sampleLengthMS = 20f;
var rmsLevels = new float[channelCount];
var rmsObtained = Bass.BASS_ChannelGetLevel(streamHandle, rmsLevels, sampleLengthMS / 1000f, BASSLevel.BASS_LEVEL_RMS);

if (rmsObtained)
     decibels = 20*Math.Log10(rmsLevels[0]);   //using first channel (index 0) but you can get both if needed.
else
     Console.WriteLine(Bass.BASS_ErrorGetCode());

希望这有帮助。