我对Android很新,我已经搜索了很长一段时间了。我想构建一个类似分贝计的应用程序。实时显示声级。在房间里有很多噪音,会有一些东西表明,如果它安静的东西会表明!。
我根本不知道如何做到这一点。谁能解释一下麦克风声级应用的基础知识呢?如果可能,可能会提供一些代码吗?
谢谢!
答案 0 :(得分:1)
您可以使用MediaRecorder.getMaxAmplitude()
。
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO},
RECORD_AUDIO);
}
使用MediaRecorder获取噪声水平,
mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
mRecorder.setOutputFile("/dev/null");
try {
mRecorder.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mRecorder.start();
启动MediaRecorder,
private Runnable mSleepTask = new Runnable() {
public void run() {
//Log.i("Noise", "runnable mSleepTask");
mSensor.start();
if (!mWakeLock.isHeld()) {
mWakeLock.acquire();
}
//Noise monitoring start
// Runnable(mPollTask) will execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL);
}
};
创建可运行线程以经常检查噪声水平,
private Runnable mPollTask = new Runnable() {
public void run() {
double amp = mSensor.getAmplitude();
//Log.i("Noise", "runnable mPollTask");
// Runnable(mPollTask) will again execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL);
}
};
使用以下公式将幅度转换为分贝
return 20 * Math.log10(mRecorder.getMaxAmplitude() / 2700.0);
监视声音并发出大声警报。
// Create runnable thread to Monitor Voice
private Runnable mPollTask = new Runnable() {
public void run() {
double amp = mSensor.getAmplitude();
//Log.i("Noise", "runnable mPollTask");
updateDisplay("Monitoring Voice...", amp);
if ((amp > mThreshold)) {
callForHelp(amp);
//Log.i("Noise", "==== onCreate ===");
}
// Runnable(mPollTask) will again execute after POLL_INTERVAL
mHandler.postDelayed(mPollTask, POLL_INTERVAL);
}
};
答案 1 :(得分:0)
市场上有一款名为Audalyzer的优秀应用
http://code.google.com/p/moonblink/wiki/Audalyzer
同时查看此讨论..
Android: sample microphone without recording to get live amplitude/level?
答案 2 :(得分:0)
此问题已针对Java进行了一般性解决,并且Android中提供了所需的类。
基本思想是为麦克风采样数据线,并从返回的缓冲区计算级别。
How to calculate the level/amplitude/db of audio signal in java?
您还可以查看进行FFT频率分析的Visualizer类,但麦克风的权限可能在各种设备上不一致。您可能还必须将其连接到Equalizer类才能访问麦克风。
https://developer.android.com/reference/android/media/audiofx/Visualizer.html