首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Bass.DLL的简易婴儿监护仪

基于Bass.DLL的简易婴儿监护仪
EN

Stack Overflow用户
提问于 2016-10-30 09:51:42
回答 2查看 886关注 0票数 4

我正试图为Windows编写一个简单的Babymonitor (个人使用)。婴儿监视器应该只检测麦克风的dB级别,并在一定音量下触发。

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

在这些示例中,我找到了一个livespec示例,它“几乎”满足了我的需要。该示例使用BASS_ChannelGetData,但我不太知道如何处理返回的数组.

我想保持它尽可能简单:从麦克风检测音量为dB或任何其他值(例如值0-MAXINT)。

如何使用Bass.dll库来完成这一任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-31 14:33:13

BASS_ChannelGetLevel返回上限为0dB的值(在本例中返回值为32768 )。如果您调整您的源电平(在声卡设置中较低的麦克风电平),那么它将工作得很好。

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

我还建议您监视声音级别一段时间:只有当某个级别至少存在2-3秒时才触发(这样您就可以排除错误警报)。

票数 3
EN

Stack Overflow用户

发布于 2016-12-13 23:19:39

下面是如何获得给定输入流句柄(StreamHandle)的db级别:

代码语言:javascript
复制
var peak = (double)Bass.BASS_ChannelGetLevel(streamHandle);
var decibels = 20 * Math.Log10(peak / Int32.MaxValue);

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

代码语言:javascript
复制
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());

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40327832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档