我正在编写一个应用程序,基本上只是测试我们是否可以通过麦克风获取任何内容。
它可以在几个Android设备上完美运行,但不适用于LG Optimus。每当我在LG上调用MediaRecorder.getMaxAmplitude
时,它返回0。
设备录制成功,因为我可以收听录音。
答案 0 :(得分:8)
getMaxAmplitude返回自您上次调用它以来的最大幅度。
因此,第一次调用它时,它会自动初始化(因此返回0),它应该返回另一个值。根据文件:
getMaxAmplitude()返回自上次调用此方法以来采样的最大绝对振幅。只在setAudioSource()之后调用它。
返回自上次调用以来测量的最大绝对幅度,或第一次调用时的0
或者,如果你正确使用它,你会遇到与我相同的问题。我的代码适用于galaxyTab 7(Froyo),但不适用于10.1(Honeycomb)。
编辑:我修复了我的问题(我希望它也会帮助你)。确保第一次调用getMaxAmplitude时,为了初始化它,首先调用start()。 我用过:recorder.prepare();
recorder.getMaxAmplitude();
recorder.start();
//listening to the user
int amplitude = recorder.getMaxAmplitude();
应该是:
recorder.prepare();
recorder.start();
recorder.getMaxAmplitude();
//listening to the user
int amplitude = recorder.getMaxAmplitude();
编辑:此代码似乎仍有缺陷。例如,此代码似乎不适用于S2。它会返回0.但是我只调用了两次getMaxAmplitude(),所以如果你需要每秒更新幅度,那么它可能没问题。
答案 1 :(得分:1)
解决方案是在线程内部读取振幅。你会看到你不时会有一个不同于0.0f的值。
private Runnable mPollTask = new Runnable() {
public void run() {
while(true){
double amp = mSensor.getAmplitude();
System.out.print("Amplitude: ");
System.out.println(amp);
}
}
};
答案 2 :(得分:1)
以下代码适用于我,需要设置setAudioSamplingRate
和setAudioEncodingBitRate
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);
}