Android getMaxAmpliance()始终返回0
我试图得到Android getMaxAmpliance()始终返回0,android,decibel,Android,Decibel,我试图得到声级压力以分贝表示,但我总是得到0。(文本视图的输出是-Infinity,但因为log(0)=-Infinity Manifest.xml中的权限: <uses-permission android:name="android.permission.RECORD_AUDIO" /> 但是什么都没有,仍然变得越来越强大-无限 我认为您需要按照开发人员说明调用recorder.prepare()和recorder.start() 更新您还必须设置输出文件(文件路径) 试试这个
声级压力
以分贝
表示,但我总是得到0
。(文本视图的输出是-Infinity,但因为log(0)=-Infinity
Manifest.xml
中的权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
但是什么都没有,仍然变得越来越强大-无限
我认为您需要按照开发人员说明调用recorder.prepare()和recorder.start()
更新您还必须设置输出文件(文件路径)
试试这个:
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);
recorder.setOutputFile("/dev/null");
try {
recorder.prepare();
recorder.start();
} catch(IllegalStateException e)
{
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
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));
sound.setText("" + amplitudeDb);
}
});
}
}
如果没有/32768,我得到的值在30分贝(我安静的房间)和88分贝(当我放大声的音乐时)之间
我想他们没问题下面的代码适合我,需要设置“setAudioSamplingRate”和“setAudioEncodingBitRate”
recorder.GetMaxAmplium()是否每次都返回0?@Mark Gilchrist是的。我正在两个不同的设备上进行尝试您是否尝试在“活动”中添加一个按钮并从UI线程获取值,以及为什么要调用runOnUIThread()当你的任务不在后台时?你检查过录音是包含声音还是只有静默吗?你没有调用recorder.prepare()或recorder.start(),我添加了recorder.prepare();recorder.start();但我只在日志中得到一个错误无法启动活动组件信息{beta_toolbox.pier.beta_toolbox/beta_toolbox.pier.beta_toolbox.SLP}:java.lang.IllegalStateException java.lang.IllegalStateException联机记录器.start();如果你将stacktrace粘贴到你的问题中,我可能会有更多的帮助。它是否说了一些类似于……由……引起的内容,整个stacktrace将更有帮助,你可以通过编辑itLet us将其添加到你的问题中。是的,实际上它是有效的,我也得到了该范围内的值。但我对操作不是很确定,我的意思是,很多问题在上一节课上,我看到有人说要得到db的值,我必须这样做:powerDb=20*log10(getAmplificate()/referenceAmp);_有4个问题可以让你理解:1)2)3)4)哦,我明白了,我只要有int-Amplificate=recorder.getMaxAmplificate();double AmplicatedB=20*Math.log10((双)Math.abs(振幅));以获得声级压力。非常感谢男士:D
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);
}
});
}
}
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(PATH_NAME);
recorder.prepare();
recorder.start(); // Recording is now started
...
recorder.stop();
recorder.reset(); // You can reuse the object by going
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);
recorder.setOutputFile("/dev/null");
try {
recorder.prepare();
recorder.start();
} catch(IllegalStateException e)
{
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
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));
sound.setText("" + amplitudeDb);
}
});
}
}
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
if (Build.VERSION.SDK_INT >= 10) {
recorder.setAudioSamplingRate(44100);
recorder.setAudioEncodingBitRate(96000);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
} else {
// older version of Android, use crappy sounding voice codec
recorder.setAudioSamplingRate(8000);
recorder.setAudioEncodingBitRate(12200);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
}
recorder.setOutputFile(file.getAbsolutePath());
try {
recorder.prepare();
} catch (IOException e) {
throw new RuntimeException(e);
}