使用MediaRecorder
我从设备的麦克风捕捉声音。从我得到的声音中,我只需要分析音量(声音响度),而不将声音保存到文件中。android:检测声音水平
两个问题:
- 我如何获得的声音响度在给定时刻?
- 如何在不将声音保存到文件的情况下进行分析?
谢谢。
使用MediaRecorder
我从设备的麦克风捕捉声音。从我得到的声音中,我只需要分析音量(声音响度),而不将声音保存到文件中。android:检测声音水平
两个问题:
谢谢。
使用mRecorder.getMaxAmplitude();
对于声音的分析,不保存所有你需要的是使用mRecorder.setOutputFile("/dev/null");
Here's一个例子,我希望这有助于
public class SoundMeter {
private MediaRecorder mRecorder = null;
public void start() {
if (mRecorder == null) {
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
mRecorder.prepare();
mRecorder.start();
}
}
public void stop() {
if (mRecorder != null) {
mRecorder.stop();
mRecorder.release();
mRecorder = null;
}
}
public double getAmplitude() {
if (mRecorder != null)
return mRecorder.getMaxAmplitude();
else
return 0;
}
}
我玩了几个录音源代码应用程序,但它好一段时间才能得到它。
您可以复制谷歌的NoiseAlert源代码 - SoundMeter代码,这是我用过的。
getMaxAmplitude范围从0到32768. EMA的东西,我没有打扰使用。
在你的主要活动中,你必须声明一个MediaRecorder对象,并按Anna的引用调用它的start()函数。
欲了解更多信息,你可以参考我的项目: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-i-e-how-to-transmit-send-data-from-android-to-arduino-bluesmirf-silver-using-bluetooth/ 地方,我需要发送声音振幅通过蓝牙的价值。
确切的代码是在这里:https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin
通过有什么关联的MediaRecorder对象的部分只是走马观花。
该网页http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from-android-to-arduino-根据WordPress的说法,bluesmirf-silver-using-bluetooth“不再可用”。 –
如果要分析直接从话筒取声音的样品没有在文件中保存数据,您需要使用AudioRecord对象如下:
int sampleRate = 8000;
try {
bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate,
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT, bufferSize);
} catch (Exception e) {
android.util.Log.e("TrackingFlow", "Exception", e);
}
然后,你必须开始录制准备时:
audio.startRecording();
现在是时候开始读取样本如下:
short[] buffer = new short[bufferSize];
int bufferReadResult = 1;
if (audio != null) {
// Sense the voice...
bufferReadResult = audio.read(buffer, 0, bufferSize);
double sumLevel = 0;
for (int i = 0; i < bufferReadResult; i++) {
sumLevel += buffer[i];
}
lastLevel = Math.abs((sumLevel/bufferReadResult));
最后一个代码组合了所有不同的采样幅度,并将平均值分配给lastLeveL变量,有关更多详细信息,请参阅此post。
问候!
此算法已损坏 - 您无法将这些值加起来,因为这些值都是有符号值。你必须采取*幅度*和平均值。 –
@Martin:“lastLevel”是MaxAmplitude?其实我需要计算'dbValue'和'MeanLevelTotal'的值,并且我没有使用预先录制的文件。我正在进行现场录音。 –
我喜欢/ dev/null,但我不明白如何每秒获得MaxAmplitude几次。 –
我需要连续记录声压级(每秒100次)。录制的声音级别(响度)应该从我录制它的那一刻开始。 –
我解决了。 getMaxAmplitude()返回值在android开发网站上是这样解释的:自上次调用以来测得的最大绝对幅度,或者当第一次调用时为0,并且获得任何秒数这个值我使用了一个Timer。 –