1

所以,我的主要问题是我还不知道实际的问题是什么。我有两个麦克风,当使用任何一个时,我的程序检测 db 中的音量只能检测到 90 max。我不确定这是对麦克风的限制,还是程序的限制,但它清楚地表明它是 90db,并且无论是否是它都不会更高。如果这证明有帮助,我的麦克风是便宜的罗技网络摄像头和蓝色的雪人麦克风(不便宜)。

如果是麦克风,为什么会发生这种情况,如果不是,那么这是我用来确定数据库级别的代码:

AudioFormat audioFormat = getAudioFormat();
TargetDataLine targetDataLine;
try {
    targetDataLine = (TargetDataLine) AudioSystem.getTargetDataLine(audioFormat);
    targetDataLine.open();
    targetDataLine.start();
    byte [] buffer = new byte[2000];
    while (true) {
        int bytesRead = targetDataLine.read(buffer,0,buffer.length);
         if (bytesRead >= 0) {
             max = (int) (buffer[0] + (buffer[1] << 8));
             for (int p=2;p<bytesRead-1;p+=2) {
                 int thisValue = (int)(buffer[p] + (buffer[p+1] << 8));
                 if (thisValue > max) max = thisValue;
             }

         }
    }
} catch (LineUnavailableException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
currentDecibelLabel.setText(Integer.toString((int)(20 * Math.log10(max)))));

有任何想法吗?谢谢!!

编辑:你知道,'max' 是一个global int.

4

1 回答 1

3

你的max变量很短。

根据oracle,一个短的最大值是 32767(有符号的 16 位/2 字节值)

20*log10(32767) = 90.3087

当您将其转换为 int 时,它会舍入到 90。

如果 API 只为您提供 2 个字节来获取音量,并且如果(且仅当)它是无符号的,您可以定义max为 int 而不是将最大值加倍至 96dB。

于 2018-08-16T13:33:11.227 回答