我正试图为Windows编写一个简单的Babymonitor (个人使用)。婴儿监视器应该只检测麦克风的dB级别,并在一定音量下触发。
经过一些研究,我找到了Bass.dll库,并发现了它的函数BASS_ChannelGetLevel,它很好,但似乎有局限性,不符合我的需要(峰值等于DWORD值)。
在这些示例中,我找到了一个livespec示例,它“几乎”满足了我的需要。该示例使用BASS_ChannelGetData,但我不太知道如何处理返回的数组.
我想保持它尽可能简单:从麦克风检测音量为dB或任何其他值(例如值0-MAXINT)。
如何使用Bass.dll库来完成这一任务?
发布于 2016-10-31 14:33:13
BASS_ChannelGetLevel返回上限为0dB的值(在本例中返回值为32768 )。如果您调整您的源电平(在声卡设置中较低的麦克风电平),那么它将工作得很好。
另一种方法是,如果您想要获得无上限值,则使用BASS_ChannelGetLevelEx函数:它返回浮点级别,其中1是最大( 0dB )值,对应于BASS_ChannelGetLevel的32767,但它可以超过1来检测大于0dB的声级,这正是您可能需要的。
我还建议您监视声音级别一段时间:只有当某个级别至少存在2-3秒时才触发(这样您就可以排除错误警报)。
发布于 2016-12-13 23:19:39
下面是如何获得给定输入流句柄(StreamHandle)的db级别:
var peak = (double)Bass.BASS_ChannelGetLevel(streamHandle);
var decibels = 20 * Math.Log10(peak / Int32.MaxValue);或者,您可以使用以下方法获得均方根(平均)峰值。要获得均方根值,必须将样本长度传递到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());希望这能有所帮助。
https://stackoverflow.com/questions/40327832
复制相似问题