首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在录音的同时获得分贝值?

在录音的同时获得分贝值?
EN

Stack Overflow用户
提问于 2012-01-07 08:50:25
回答 1查看 8.7K关注 0票数 2

有没有办法在录音时获得声音的分贝值?我现在正在用MediaRecorder录制声音

我不能在Marketplace上使用任何应用程序,因为我不能确定用户是否会在他们的手机上安装它,例如Audalyzer

我正在使用以下公式,但不确定它们是否正确,或者我的结果是否正确!

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

当前结果:

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

回答 1

Stack Overflow用户

发布于 2012-01-07 08:57:32

使用AudioRecord,您可以直接访问音频样本...从那里,你可以计算声音的音量,以分贝或任何你想要的方式...

This似乎也是关于同样的问题(并且有计算公式)

编辑(基于注释和额外代码):

现在,您正在使用的变量data[]是声明为数组、字节还是短整型?这将改变将使用哪一个read()函数。如果你声明它为短线,那么这将会照顾到你的16位。如果将其声明为字节数组,则必须组合两个连续的字节。

你不应该担心负值和正值,你应该只将data[]声明为一个“unsigned short”数组。

您需要了解分贝值是将当前音量与其他音量进行比较。我不是真正的专家,但我相信大多数时候你会把它与最大可能的振幅进行比较。我相信,现在,你正在做的计算是比较两个连续的样本,这就是为什么值相当低的原因…不使用p1,而使用值65535 (这是可能的最大值)。然后,你应该看到分贝值是一个负值,当没有任何东西时,应该随着噪声的增加而增加(但仍然是负值)。

编辑(基于最新代码):

由于样本大小为16位,请使用短路...

代码语言:javascript
复制
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,哪里就不应该有。

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

https://stackoverflow.com/questions/8766383

复制
相关文章

相似问题

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