所以,这里的主要问题是我还不知道实际的问题是什么。我有两个麦克风,使用其中一个麦克风时,检测db中音量的程序最多只能检测90个麦克风。我不确定这是否是麦克风的限制,还是它是程序,但它清楚地表明它是90db,并且无论它是否高,它都不会更高。如果证明有帮助,我的麦克风是便宜的Logitech网络摄像头和蓝色的雪人麦克风(不便宜)。
如果是麦克风,为什么会这样呢?如果没有,那么这就是我要弄清楚数据库级别是什么的代码:
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
。
答案 0 :(得分:3)
您的max
变量很短。
根据oracle,简短最大值为32767(有符号16位/ 2字节值)
20*log10(32767) = 90.3087
当您将其转换为int时,它会四舍五入为90。
如果API仅给您2个字节来获取音量,并且(如果(并且仅当)它是未签名的),则可以将max
定义为int而不是将最大值提高一倍值达到96dB。