当前位置:编程学习 > wap >>

关于android获取录音音量的问题。

我在做一个软件。需要获取麦克接收到的音量,但在不同手机上的测试效果不一样。请问哪为朋友做过?才忙看看吧。

audioRecord.read(buffer, 0, recBufSize);
int t = 0;
for (int i = 0; i < buffer.length; i++) {
t += Math.abs(buffer[i]);
}
t /= buffer.length;
System.out.println("你的音量" + t);

这是我的代码。在我用同样的音量说话,在我的HTC机上测试t的值是3000左右,但在摩托的一款手机上测试居然达到了15000。有谁知道这是怎么回事?有什么解决方案? --------------------编程问答-------------------- 如何判定你用同样的音量在说话,有没有考虑到周围的噪声? --------------------编程问答--------------------     527     //---------------------------------------------------------
    528     // Audio data supply
    529     //--------------------
    530     /**
    531      * Reads audio data from the audio hardware for recording into a buffer.
    532      * @param audioData the array to which the recorded audio data is written.
    533      * @param offsetInBytes index in audioData from which the data is written expressed in bytes.
    534      * @param sizeInBytes the number of requested bytes.
    535      * @return the number of bytes that were read or or {@link #ERROR_INVALID_OPERATION}
    536      *    if the object wasn't properly initialized, or {@link #ERROR_BAD_VALUE} if
    537      *    the parameters don't resolve to valid data and indexes.
    538      *    The number of bytes will not exceed sizeInBytes.
    539      */
    540     public int read(byte[] audioData, int offsetInBytes, int sizeInBytes) {
    541         if (mState != STATE_INITIALIZED) {
    542             return ERROR_INVALID_OPERATION;
    543         }
    544 
    545         if ( (audioData == null) || (offsetInBytes < 0 ) || (sizeInBytes < 0)
    546                 || (offsetInBytes + sizeInBytes > audioData.length)) {
    547             return ERROR_BAD_VALUE;
    548         }
    549 
    550         return native_read_in_byte_array(audioData, offsetInBytes, sizeInBytes);
    551     }


这是read 的实现函数,你用这个函数得到音量不对吧? buffer 里面是记录的record的数据呀。
用这个函数吧:

  442 void AudioTrack::getVolume(float* left, float* right)
    443 {
    444     *left  = mVolume[LEFT];
    445     *right = mVolume[RIGHT];
    446 } --------------------编程问答--------------------
引用 1 楼 zhzxlc_06 的回复:
如何判定你用同样的音量在说话,有没有考虑到周围的噪声?

不是环境影响,我是在办公室测的,环境是一样的,而且是两个手机同时测的。
我觉得有点像是手机麦克敏感度的问题。 --------------------编程问答--------------------
引用 2 楼 fishmen26 的回复:
527 //---------------------------------------------------------
  528 // Audio data supply
  529 //--------------------
  530 /**
  531 * Reads audio data from the audio hardware for recording int……


我没记错的话read中获取到的buffer 记录到的是音波振幅,这个和音量是成正比的。
请问getVolume获取的是怎么音量?怎么用的? --------------------编程问答-------------------- 才做完录音播放的软件 我给你说说我的经验吧。


for (int i = 0; i < buffer.length; i++) {
v += buffer[i] * buffer[i];
}


int value = (int) (Math.abs((int)(v /(float)r)/10000) >> 1);



我计算了噪音 
value 的 值 控制 为 0 到 100 之间 0为最小  》= 100为最大!! --------------------编程问答-------------------- Hope this can give you some inspire

http://blog.csdn.net/hellogv/article/details/6026455 --------------------编程问答--------------------
引用 5 楼 xys289187120 的回复:
才做完录音播放的软件 我给你说说我的经验吧。


Java code

    for (int i = 0; i < buffer.length; i++) {
        v += buffer[i] * buffer[i];
    }
                            
    
    int value = (int) (Math.abs(……


正解,谢谢。
不过我还是没太明白这算法的原理,能不能给我讲讲? --------------------编程问答--------------------
引用 6 楼 fishmen26 的回复:
Hope this can give you some inspire

http://blog.csdn.net/hellogv/article/details/6026455


这个博客我已经看过了,但好像跟我要的东西有些出入。 --------------------编程问答--------------------
引用 5 楼 xys289187120 的回复:
才做完录音播放的软件 我给你说说我的经验吧。

Java code

    for (int i = 0; i < buffer.length; i++) {
        v += buffer[i] * buffer[i];
    }
                            
    
    int value = (int) (Math.abs((int)(v……


哇 牛牛牛 
我是个算法白痴,拿笔划了半天,亮点是float r --------------------编程问答-------------------- 关于为什么是 平方和 而不是 ||和
解释是:平方和除以数据总长度,得到音量大小。可以获取白噪声值,然后对实际采样进行标准化。

也需要补充一下关于音频信号的采样的知识了。 不知道我说的对否 ,期待5L回复  --------------------编程问答-------------------- 学习了!!! --------------------编程问答-------------------- --------------------编程问答-------------------- 路过,看看 --------------------编程问答-------------------- 每当我看见自己暂时不懂,但是以后可能会遇到的问题

我就会默默的mark一下 --------------------编程问答-------------------- 先学习了。 --------------------编程问答-------------------- yiyue --------------------编程问答-------------------- 像是手机麦克敏感度的问题 --------------------编程问答-------------------- 通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。 --------------------编程问答-------------------- 这是个好问题!mark了 --------------------编程问答-------------------- 看看MediaRecorder类,我没用过的,楼主可以研究下,是Android专门录音的 --------------------编程问答-------------------- 。。。不错 --------------------编程问答--------------------
引用 18 楼 scavengersfrank 的回复:
通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给缩到最小 从而控制在value 的0 到100可控  --------------------编程问答-------------------- audioRecord.read(buffer, 0, recBufSize);
int t = 0;
for (int i = 0; i < buffer.length; i++) {
    t += Math.abs(buffer[i]);
}
t /= buffer.length;
System.out.println("你的音量" + t);

--------------------编程问答--------------------
引用 22 楼 yiyaaixuexi 的回复:
引用 18 楼 scavengersfrank 的回复:

通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给缩到最小 从而控制在value 的0 到100可控

这个我知道。。但我不明白的是为什么我正常说话和大叫的音量顶峰值是一样的呢? --------------------编程问答-------------------- 其实这个算法还是有优化的余地, 最近我就在公司做优化算法这一块,到时候一定及时分享给大家~~~~
我的博客:http://blog.csdn.net/xys289187120 --------------------编程问答--------------------
引用 24 楼 scavengersfrank 的回复:
引用 22 楼 yiyaaixuexi 的回复:
引用 18 楼 scavengersfrank 的回复:

通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给缩到最小 从而控制在value 的0 到100可控

这个我知道。。但我不明白的是为什么我正常说话和大叫的音量……


我的意思是说,差值 就是大叫和不大叫 的音量 的差值 ,被控制认为为最小。这么看来 就不太合理。仅仅是为了显示数值给用户看了。 --------------------编程问答--------------------
引用 25 楼 xys289187120 的回复:
其实这个算法还是有优化的余地, 最近我就在公司做优化算法这一块,到时候一定及时分享给大家~~~~
我的博客:http://blog.csdn.net/xys289187120


在实现前 说说想法 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 我们的机器,录音声音一直很小,一直认为是硬件问题,在LINUX下面,直接采集,音量也小....
不过开眼了,上层也有问题..学习,先MARK! --------------------编程问答-------------------- 我觉得算音量应该做傅里叶变换,再求频谱的能量。因为声音是振动产生的,变化才能有声音,单纯时域信号不能衡量音量。
个人见解。
引用 18 楼 scavengersfrank 的回复:
通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。
--------------------编程问答-------------------- 近期可能用到,果断马克之 --------------------编程问答-------------------- 那个大神 看看我的问题  
菜鸟问个基础问题 100分,进者有分 --------------------编程问答-------------------- tea394064923@gmail.com --------------------编程问答-------------------- 关注下! --------------------编程问答--------------------
引用 26 楼 yiyaaixuexi 的回复:
引用 24 楼 scavengersfrank 的回复:
引用 22 楼 yiyaaixuexi 的回复:
引用 18 楼 scavengersfrank 的回复:

通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给缩到最小 从而控制在value 的0 到100可控
……


我觉得问题好像不是出在差值上。我通过反复测试发现五楼的算法好像并不是把值控制在0到100之间,我对着手机麦克播放音乐,首先把音乐声音关到最小,然后逐步放大音量。麦克接收到的音量值也会跟这重零开始逐步增长。但当接收到的音量达到50多的时候便停止增长了。而且无论我将音乐声音再放大录制的音量也是50多。如果将五楼公式中是“>> 1”去掉则最高停留在110多。所以我认为五楼的算法应该是在0到60之间。
但现在的问题是如果我手机一边播放音乐一边录音,播放音量开到一半的时候录音音量就达到顶峰了。这是很让人郁闷的一件事。 --------------------编程问答-------------------- 如何通过麦克风来获取当前说话的音量或分贝高低:
http://topic.csdn.net/u/20101229/14/01099efc-d8e1-43d5-a714-2a84f72c4496.html
引用 36 楼 scavengersfrank 的回复:
引用 26 楼 yiyaaixuexi 的回复:
引用 24 楼 scavengersfrank 的回复:
引用 22 楼 yiyaaixuexi 的回复:
引用 18 楼 scavengersfrank 的回复:

通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给……
--------------------编程问答-------------------- android的东西没有做过 --------------------编程问答--------------------
引用 36 楼 scavengersfrank 的回复:
引用 26 楼 yiyaaixuexi 的回复:
引用 24 楼 scavengersfrank 的回复:
引用 22 楼 yiyaaixuexi 的回复:
引用 18 楼 scavengersfrank 的回复:

通过今天的测试感觉五楼的算法好像也有点问题,我对着麦克正常说话时音量可以达到五十,但是我对着麦克大喊音量并没有提高。。


就是说这个算法的实质就是把 变化 的值给缩……


那么我还是好奇,到底是应该在算法上下功夫去解决这个问题,还是别的方向 --------------------编程问答-------------------- 收藏了~ --------------------编程问答-------------------- 东西没有做过 --------------------编程问答-------------------- 东西没有做过 --------------------编程问答-------------------- 看看!! --------------------编程问答-------------------- 23452345 --------------------编程问答-------------------- xuexi --------------------编程问答-------------------- 谢谢 谢谢 学些 --------------------编程问答-------------------- 路过学习 --------------------编程问答-------------------- 三楼正解 --------------------编程问答-------------------- 路过,看看 --------------------编程问答-------------------- 先学习了. --------------------编程问答-------------------- 这几天我查了一些资料,有了一点思路,但还是存在一些问题,现在给大家讲讲我的想法,大家看看对不对。
我在百度百科上看到这样一句话:
在CD中,其分层以后的幅度信号用16比特的二进制信号来表示,也就是把模拟的音频信号在幅度上分为65,536层。这样,它的动态范围就可以达到96分贝=20Log65536(6分贝/比特)。
看到这个我突然想到short占用空间也是16比特,于是:

short[] buffer = new short[recBufSize];
int r = audioRecord.read(buffer, 0, recBufSize);

但在这里就出现了一个问题,short的容量虽然是65536但是它的取值范围却是-32768到32767。于是我有一个猜想:

if(buffer[i] < 0){
t += (Math.abs(buffer[i] * 2) + 1);
}else{
t += (buffer[i] * 2);
}

这样我就可以得到一个0到65536的值了。
然后开始计算分贝。
根据上没提到的公式96分贝=20Log65536。

float dB = 20 * (float)Math.log10(t);

这样我就得到了一个分贝值,感觉上得到的结果比较符合实际,但这套算法中包含一些我猜想的因素,所以我也无法确定结果是不是正确的。 --------------------编程问答-------------------- 51楼中间的算法应该是:

if(buffer[i] > 0){
    t += (buffer[i] * 2 - 1);
}else{
    t += (Math.abs(buffer[i] * 2));
}
--------------------编程问答-------------------- 37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。 --------------------编程问答-------------------- 算法错了吧,不是那样计算的。 --------------------编程问答--------------------
引用 53 楼 crystal28 的回复:
37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。


恕我才疏学浅。。实在是没搞明白FFT。。 --------------------编程问答--------------------
引用 53 楼 crystal28 的回复:
37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。


有道理 ...
  --------------------编程问答--------------------
引用 55 楼 scavengersfrank 的回复:
引用 53 楼 crystal28 的回复:
37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。


恕我才疏学浅。。实在是没搞明白FFT。。


其实我觉得只要照办算法就好,也没有必要清晰的理解 信号分析的知识, 傅立叶也不会写程序呀,你说呢?除非你兴趣十足 --------------------编程问答-------------------- 厉害,支持你lz --------------------编程问答-------------------- Android还好,公开原码!.NET有时写得想喷微软! --------------------编程问答-------------------- 学习啦!。。。 --------------------编程问答-------------------- MARK --------------------编程问答-------------------- 这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用 --------------------编程问答--------------------                路过,打酱油 --------------------编程问答-------------------- 愿闻其详。
引用 62 楼 drsmart 的回复:
这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用
--------------------编程问答-------------------- 路过学习 --------------------编程问答--------------------
引用 62 楼 drsmart 的回复:
这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用


愿闻其详。 --------------------编程问答-------------------- 路过,顺便学习学习! --------------------编程问答-------------------- 随便看看 --------------------编程问答-------------------- 顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶 --------------------编程问答-------------------- 学习学习 --------------------编程问答--------------------
引用 64 楼 crystal28 的回复:
愿闻其详。

引用 62 楼 drsmart 的回复:

这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用


使用MediaRecorder类,有方法获取振幅 --------------------编程问答-------------------- 路过学习 --------------------编程问答--------------------
引用 71 楼 drsmart 的回复:
引用 64 楼 crystal28 的回复:
愿闻其详。

引用 62 楼 drsmart 的回复:

这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用


使用MediaRecorder类,有方法获取振幅


大哥。。这个是众所周知的。。。我们现在在讨论的是怎样将振幅转换成音量。。 --------------------编程问答--------------------
引用 57 楼 yiyaaixuexi 的回复:
引用 55 楼 scavengersfrank 的回复:
引用 53 楼 crystal28 的回复:
37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。


恕我才疏学浅。。实在是没搞明白FFT。。


其实我觉得只要照办算法就好,也没有必要清晰的理解 信号分析的知识, 傅……


问题是傅立叶的算法究竟是什么样的呢? --------------------编程问答-------------------- 这里有个c版本的fft:
http://www.codeproject.com/KB/audio-video/waveInFFT.aspx
可能网上有更简单的。
用法:

//PCM数据地址pInput,长度nInputLen,fft的结果实部放在fft_real,虚部放在fft_Imag,
//音量就求实部虚部的平方和
fft_double(nInputLen,0,pInput,NULL,fft_real,fft_Imag);
--------------------编程问答--------------------
引用 71 楼 drsmart 的回复:
引用 64 楼 crystal28 的回复:
愿闻其详。

引用 62 楼 drsmart 的回复:

这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用


使用MediaRecorder类,有方法获取振幅


一直不都在讨论转换音量表示的算法么 --------------------编程问答--------------------
引用 74 楼 scavengersfrank 的回复:
引用 57 楼 yiyaaixuexi 的回复:
引用 55 楼 scavengersfrank 的回复:
引用 53 楼 crystal28 的回复:
37楼不是给出了解决办法吗?
直接做fft就行,你在时域无论如何处理都得不到正确结果,因为算法错误。
衡量音量大小是要看信号频域的能量,而不是时域的能量。


恕我才疏学浅。。实在是没搞明白FFT。。


其实我觉得只要照办……


频域的计算 我们在时域表示不了   --------------------编程问答--------------------
引用 75 楼 crystal28 的回复:
这里有个c版本的fft:
http://www.codeproject.com/KB/audio-video/waveInFFT.aspx
可能网上有更简单的。
用法:

C/C++ code

//PCM数据地址pInput,长度nInputLen,fft的结果实部放在fft_real,虚部放在fft_Imag,
//音量就求实部虚部的平方和
fft_double(nInput……


还得用jni调用 工程 有点大 
希望在java层解决呀  --------------------编程问答--------------------
引用 76 楼 yiyaaixuexi 的回复:
引用 71 楼 drsmart 的回复:
引用 64 楼 crystal28 的回复:
愿闻其详。

引用 62 楼 drsmart 的回复:

这帖子看了下,回复讨论的,其实都太麻烦了,看来都没有认真看SDK啊。有现成的方法不用


使用MediaRecorder类,有方法获取振幅


一直不都在讨论转换音量表示的算法么


长篇大论的,确实懒得看,不过我过去做过相关的软件在PC,当时用的是Lame中的算法,翻翻Lame源码应该比较简单 --------------------编程问答-------------------- 顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶 --------------------编程问答-------------------- 最近在做一个android application,一直在寻找这个问题的答案,唯一能搜到的只有:
http://blog.csdn.net/zhjp4295216/archive/2010/11/09/5996735.aspx
但是这个运行时会被迫关闭,不知道是哪里有问题,以为是manifest中每注册<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
加上了之后还是不行,难道只因为天气太热了?!
--------------------编程问答-------------------- 各位看过这个代码没有嘛? --------------------编程问答--------------------
引用 81 楼 zhi_jian 的回复:
最近在做一个android application,一直在寻找这个问题的答案,唯一能搜到的只有:
http://blog.csdn.net/zhjp4295216/archive/2010/11/09/5996735.aspx
但是这个运行时会被迫关闭,不知道是哪里有问题,以为是manifest中每注册<uses-permission android:name="android.permiss……

这方法明显不对。获取的根本不是音量,充其量可以算是平均振幅。。 --------------------编程问答-------------------- --------------------编程问答-------------------- 如果不想用jni,只能fft全用java写 --------------------编程问答-------------------- 楼主结贴了没?方法找到了嘛? --------------------编程问答-------------------- 如何在java层获取麦克风的音量呢~~~!!!LZ解决了?? --------------------编程问答-------------------- 恢复就有10分  恢复就有10分   --------------------编程问答-------------------- Android原版的算法是取log运算级别的 --------------------编程问答--------------------
引用 87 楼 shenxiaolinil 的回复:
如何在java层获取麦克风的音量呢~~~!!!LZ解决了??

问题还没有解决。。 --------------------编程问答--------------------
引用 89 楼 sharco 的回复:
Android原版的算法是取log运算级别的

没明白。。能否再讲详细些? --------------------编程问答-------------------- 爱买呀,好晕啊,学习 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 不会还没解决吧。。。分享下啊,各位 --------------------编程问答-------------------- 我read出来的数据buffer全为0,但返回的length是正常值,有没有大神指点下啊!!
都弄了我好几个星期啦,硬件什么都是好的~~Nexus S手机上~~~ --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,