首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的麦克风级别

Java中的麦克风级别
EN

Stack Overflow用户
提问于 2010-10-10 16:27:18
回答 2查看 8.8K关注 0票数 4

我正试着通过Java访问麦克风的级别。我不需要录制任何东西,我只想知道声级的相对尺度。

这是不是可以实时实现?

如果这是不可能的,也许这是可行的:当电平超过某个值时开始记录,当电平下降到特定电平以下一段时间时停止记录,记录四分之一秒的比特并读取它的音量,如果低于阈值则停止记录。

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-10 16:41:43

您可以通过Sound API访问麦克风,但它不会为您提供简单的响度级别。您只需捕获数据并自行决定它有多响亮。

http://download.oracle.com/javase/tutorial/sound/capturing.html

录制意味着保存数据,但在这里,一旦您确定了响度,就可以丢弃数据。

root mean squared方法是计算一段波资料振幅的一种好方法。

对于你的评论,是的,你会捕获一小段数据(可能只有几毫秒),并计算出它的振幅。根据您需要更新的频率定期重复此操作。如果你想跟踪以前的响度并比较它们,这取决于你--在这一点上,它只是比较数字。您可以使用最近响度的平均值来计算房间的环境响度,以便可以检测噪波的突然增加。

我不知道打开和关闭音频捕获需要多少开销,但您最好始终保持TargetDataLine处于打开状态,并在需要时计算其响度。当线路打开时,您需要继续对其调用read(),否则应用程序将挂起,等待您读取数据。

票数 4
EN

Stack Overflow用户

发布于 2015-09-17 11:22:54

http://www.technogumbo.com/tutorials/Java-Microphone-Selection-And-Level-Monitoring/Java-Microphone-Selection-And-Level-Monitoring.php

这方面的文章写得很好。帮了我很多。

据我所知,这使用了@Nick答案中提到的均方根值

基本上:

代码语言:javascript
复制
public int calculateRMSLevel(byte[] audioData)
{ 
    long lSum = 0;
    for(int i=0; i < audioData.length; i++)
        lSum = lSum + audioData[i];

    double dAvg = lSum / audioData.length;
    double sumMeanSquare = 0d;

    for(int j=0; j < audioData.length; j++)
        sumMeanSquare += Math.pow(audioData[j] - dAvg, 2d);

    double averageMeanSquare = sumMeanSquare / audioData.length;

    return (int)(Math.pow(averageMeanSquare,0.5d) + 0.5);
}

和用法:

代码语言:javascript
复制
int level = 0;
byte tempBuffer[] = new byte[6000];
stopCapture = false;
try {
    while (!stopCapture) {
        if (targetRecordLine.read(tempBuffer, 0, tempBuffer.length) > 0) {
            level = calculateRMSLevel(tempBuffer);
        }
    }
    targetRecordLine.close();
} catch (Exception e) {
    System.out.println(e);
    System.exit(0);
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3899585

复制
相关文章

相似问题

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