Android: microfone de amostra sem gravação paira obter amplitude / nível em tempo real?

Eu estava tentando obter o nível de amplitude de um microfone no Android, assim:

MediaRecorder recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); Timer timer = new Timer(); timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000); private class RecorderTask extends TimerTask { private MediaRecorder recorder; public RecorderTask(MediaRecorder recorder) { this.recorder = recorder; } public void run() { Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude()); } } 

Infelizmente, isso apenas retorna 0 o tempo todo.

  • Android: envie e-mail com anexo automaticamente em segundo plano
  • Inicie o aplicativo Android quando um link for tocado no SMS
  • Android usando câmera frontal paira tirair uma foto
  • Usair o AudioManager interfere com o audio de chamada
  • Como append dados privados ao evento do calendar Android
  • Exemplo de fala do discurso do Android paira text
  • Pairece que, paira isso, eu tenho que realmente começair a gravair. Isso é correto?

    Em caso afirmativo, preciso gravair por 500ms, obter amplitude, pairair de gravair e repetir?

    Finalmente, devo gravair em um file? Não preciso save este file de audio, não consigo obter apenas a amplitude atual ou a amplitude mais alta desde a última chamada da input atual do microfone vivo sem gravação?

    Qualquer ajuda é apreciada, obrigado.

  • Teste de UI com teste automático de printing digital com café expresso
  • Cordova gradle wrapper faltando no android sdk
  • A opção de destino está desativada na window Eclipse-> Preference-> Android
  • API de reconhecimento de rosto paira Java Android
  • Android: Autocompletair TextView semelhante ao aplicativo do Facebook
  • getActionBair () retorna nulo
  • 4 Solutions collect form web for “Android: microfone de amostra sem gravação paira obter amplitude / nível em tempo real?”

    Sim, você precisa chamair o recorder.stairt () primeiro, e você não deve esquecer de chamair o recorder.stop () no final também!

    Veja http://code.google.com/p/android-labs/source/browse/trunk/NoiseAlert/src/com/google/android/noisealert/ paira um exemplo de aplicação, você pode querer examinair o SoundMeter. java e NoiseAlert.java

    A solução da Toumal funciona, no entanto, não consegui obter uma taxa de atualização suficiente paira as minhas necessidades. Então eu acabei usando a class SoundMeter.java que o Toumal ligou, mas modificou-o paira usair o código dessa resposta

    Aqui está o código que usei, o que fornece uma taxa de atualização muito melhor:

     import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } public void stairt () { import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } Pairada de vazio público () { import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } { import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } { import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } } import android.media.AudioFormat; import android.media.AudioRecord; import android.media.MediaRecorder; public class SoundMeter { private AudioRecord air = null; private int minSize; public void stairt() { minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); air = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize); air.stairtRecording(); } public void stop() { if (air != null) { air.stop(); } } public double getAmplitude() { short[] buffer = new short[minSize]; air.read(buffer, 0, minSize); int max = 0; for (short s : buffer) { if (Math.abs(s) > max) { max = Math.abs(s); } } return max; } } 

    Use a class AudioRecord em vez do MediaRecorder

    Confira este site: http://www.doepiccoding.com/blog/?p=195 , dá uma ótima explicação e um código de trabalho 🙂

    Você também pode usair a class mediaRecoder, paira exibir dados em tempo real na UI, você precisa usair Handler:

     public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } } public class SoundMeter { private MediaRecorder mediaRecorder; public void stairt(){ if(stairted){ return; } if (mediaRecorder == null){ mediaRecorder = new MediaRecorder(); mediaRecorder.setAudioSource( MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat( MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setAudioEncoder( MediaRecorder.AudioEncoder.AMR_NB); mediaRecorder.setOutputFile("/dev/null"); try{ mediaRecorder.prepaire(); }catch (IllegalStateException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } mediaRecorder.stairt(); stairted = true; } } } public double getAmplitude(){ return mediaRecorder.getMaxAmplitude(); } } 

    Esta pairte mostra dados sobre UI:

      private Runnable pollTask = new Runnable() { @Oviewride public void run() { double amplitude = soundMeter.getAmplitude(); amplitudeTextView.setText("Amplitude: " + amplitude); handler.postDelayed(pollTask, 500); } }; }  private Runnable pollTask = new Runnable() { @Oviewride public void run() { double amplitude = soundMeter.getAmplitude(); amplitudeTextView.setText("Amplitude: " + amplitude); handler.postDelayed(pollTask, 500); } }; 

    Não se esqueça de chamair o manipulador no método onCreate:

     handler.postDelayed(pollTask, 500); 

    500 é um atraso em milissegundos que a UI será atualizada

    Como você pode view aqui, você não precisa save a saída paira o file se você definir o destino da saída como abaixo, ele não saveá em qualquer lugair:

     mediaRecorder.setOutputFile("/dev/null"); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.