有没有办法在录音时获得声音的分贝值?我现在正在用MediaRecorder录制声音
我不能在Marketplace上使用任何应用程序,因为我不能确定用户是否会在他们的手机上安装它,例如Audalyzer
我正在使用以下公式,但不确定它们是否正确,或者我的结果是否正确!
short data[] = new short[bufferSize];
read = recorder.read(data, 0, bufferSize);
double p2 = data[data.length-1];
System.out.println("p2: " + p2);
double decibel;
if (p2==0)
decibel=Double.NEGATIVE_INFINITY;
else
decibel = 20.0*Math.log10(p2/65535.0);
System.out.println("p2/65535: " + (p2/65535.0));
System.out.println("decibel: " + decibel);当前结果:
01-11 16:43:03.821: I/System.out(14530): p2: 0.0
01-11 16:43:03.821: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.821: I/System.out(14530): decibel: -Infinity
01-11 16:43:03.911: I/System.out(14530): p2: 0.0
01-11 16:43:03.911: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.911: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.001: I/System.out(14530): p2: 0.0
01-11 16:43:04.001: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.001: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.091: I/System.out(14530): p2: 0.0
01-11 16:43:04.091: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.091: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.191: I/System.out(14530): p2: 0.0
01-11 16:43:04.191: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.191: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.281: I/System.out(14530): p2: 0.0
01-11 16:43:04.281: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.281: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.371: I/System.out(14530): p2: 0.0
01-11 16:43:04.371: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.371: I/System.out(14530): decibel: -Infinity发布于 2012-01-07 08:57:32
使用AudioRecord,您可以直接访问音频样本...从那里,你可以计算声音的音量,以分贝或任何你想要的方式...
This似乎也是关于同样的问题(并且有计算公式)
编辑(基于注释和额外代码):
现在,您正在使用的变量data[]是声明为数组、字节还是短整型?这将改变将使用哪一个read()函数。如果你声明它为短线,那么这将会照顾到你的16位。如果将其声明为字节数组,则必须组合两个连续的字节。
你不应该担心负值和正值,你应该只将data[]声明为一个“unsigned short”数组。
您需要了解分贝值是将当前音量与其他音量进行比较。我不是真正的专家,但我相信大多数时候你会把它与最大可能的振幅进行比较。我相信,现在,你正在做的计算是比较两个连续的样本,这就是为什么值相当低的原因…不使用p1,而使用值65535 (这是可能的最大值)。然后,你应该看到分贝值是一个负值,当没有任何东西时,应该随着噪声的增加而增加(但仍然是负值)。
编辑(基于最新代码):
由于样本大小为16位,请使用短路...
short buffer[] = new short[bufferSize];
read = recorder.read(buffer, 0, bufferSize);
double p2 = data[data.length-1];
double decibel;
if (p2==0)
decibel=Double.NEGATIVE_INFINITY;
else
decibel = 20.0*Math.log10(p2/65535.0);尝试打印所有的值(datadata.length-1,p2,p2/65535,Math.log10(p2/65535)...etc...)你会发现哪里有0,哪里就不应该有。
https://stackoverflow.com/questions/8766383
复制相似问题