2015-07-08 7 views
4

Я пытаюсь получить Sound Level Pressure, выраженный в decibel, но я всегда получаю 0. (Выход TextView является -Infinity а потому лог (0) = -infinitygetMaxAmplitude() всегда возвращает 0

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

+0

является recorder.getMaxAmplitude() возвращают 0 каждый время? –

+0

@ Mark Gilchrist Да. Я пытаюсь на двух разных устройствах – Pier

+0

вы попробовали добавить кнопку в действие и получить значение из потока пользовательского интерфейса, также почему вы вызываете runOnUIThread(), когда задача не в фоновом режиме? –

ответ

3

Попробуйте с этим:

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 дБ (когда я ставлю громкую музыку).

enter image description here

Я думаю, что они все в порядке

+0

Да, на самом деле это работает, я тоже получаю значения в этом диапазоне. Но я не очень уверен в операции, я имею в виду, что многие вопросы SO, которые я видел, говорят, что для получения значения в db я должен это сделать: _ powerDb = 20 * log10 (getAmplitude()/referenceAmp); _ – Pier

+0

На SO есть 4 вопроса, которые помогут вам понять: 1) http://stackoverflow.com/questions/16072185/decibels-in-android?rq=1 2) http://stackoverflow.com/questions/13627284/android-record-decibel-from-micphone? rq = 1 3) http://stackoverflow.com/questions/9597767/decibel-sound-meter-for-android?rq=1 4) http://stackoverflow.com/questions/14453674/audio-output-level-in-a-form-that-can-be-converted-to-decibel/14455170#14455170 – Rick

+0

О, я вижу, это нормально для меня просто _int ampl = recorder.getMaxAmplitude(); двойной амплитудыDb = 20 * Math.log10 ((двойной) Math.abs (амплитуда)); _ , чтобы получить _SOUND LEVEL PRESSURE_. Большое спасибо человеку: D – Pier

1

Я думаю, вам нужно позвонить recorder.prepare() и recorder.start() в соответствии с примечания разработчика

UPDATE вы также должны установитьOutputFile (file_path);

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 
+0

Я добавил _recorder.prepare(); recorder.start(); _ но я только получаю ошибку в LogCat – Pier

+0

, что он говорит? –

+0

_Unable начать деятельность ComponentInfo {beta_toolbox.pier.beta_toolbox/beta_toolbox.pier.beta_toolbox.SLP}: java.lang.IllegalStateException_ _java.lang.IllegalStateException_ на линии _recorder.start(); _ – Pier

0

Ниже код работал для меня, нужно установить "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); 
} 
Смежные вопросы