Android MediaRecorder getMaxAmplitude在LG Optimus上始终返回0

时间:2011-07-06 17:16:16

标签: android

我正在编写一个应用程序,基本上只是测试我们是否可以通过麦克风获取任何内容。

它可以在几个Android设备上完美运行,但不适用于LG Optimus。每当我在LG上调用MediaRecorder.getMaxAmplitude时,它返回0。

设备录制成功,因为我可以收听录音。

3 个答案:

答案 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)

以下代码适用于我,需要设置setAudioSamplingRatesetAudioEncodingBitRate

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);
}