【发布时间】:2015-09-27 02:25:39
【问题描述】:
我正在尝试获取以decibel 表示的Sound Level Pressure,但我总是得到0。 (TextView 的输出是 -Infinity 但因为 log(0) = -infinity。
public class SLP extends Activity{
TextView sound;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sound_activity);
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 500);
}
private class RecorderTask extends TimerTask {
TextView sound = (TextView) findViewById(R.id.decibel);
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder) {
this.recorder = recorder;
}
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
int amplitude = recorder.getMaxAmplitude();
double amplitudeDb = 20 * Math.log10((double)Math.abs(amplitude) / 32768);
sound.setText("" + amplitudeDb);
}
});
}
}
Manifest.xml中的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
你能帮帮我吗?
更新
我也试过这个:
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/dev/null");
try {
recorder.prepare();
} catch (IOException e) {
e.printStackTrace();
}
recorder.start();
Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 500);
recorder.reset();
}
private class RecorderTask extends TimerTask {
TextView risultato = (TextView) findViewById(R.id.decibel);
private MediaRecorder recorder;
public RecorderTask(MediaRecorder recorder) {
this.recorder = recorder;
}
public double getAmplitude() {
if (recorder != null)
return (recorder.getMaxAmplitude());
else
return 0;
}
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
int amplitude = recorder.getMaxAmplitude();
double amplitudeDb = 20 * Math.log10(getAmplitude() / 32768);
//double db = 20 * Math.log(recorder.getMaxAmplitude() / 2700.0);
risultato.setText("" + amplitudeDb);
}
});
}
}
但什么都没有,仍然得到-Infinite
【问题讨论】:
-
recorder.getMaxAmplitude() 每次都返回 0 吗?
-
@Mark Gilchrist 是的。我正在尝试 2 种不同的设备
-
您是否尝试过在 Activity 中添加一个按钮并从 UI 线程获取值,以及为什么当您的任务不在后台时调用 runOnUIThread()?
-
您是否检查过录音是否包含声音或只有静音?
-
你没有调用recorder.prepare()或者recorder.start()