android: detectar el nivel de sonido

Usando MediaRecorder captura el sonido del micrófono del dispositivo. Por el sonido que obtengo, solo necesito analizar el volumen del sonido (volumen del sonido), sin guardar el sonido en un archivo.

Dos preguntas:

  1. ¿Cómo obtengo la intensidad del sonido en un momento dado en el tiempo?
  2. ¿Cómo hago el análisis sin guardar el sonido en un archivo?

Gracias.

  1. Use mRecorder.getMaxAmplitude();

  2. Para el análisis del sonido sin guardar todo lo que necesita, use mRecorder.setOutputFile("/dev/null");

Aquí hay un ejemplo, espero que esto ayude

 public class SoundMeter { private MediaRecorder mRecorder = null; public void start() { if (mRecorder == null) { mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.setOutputFile("/dev/null"); mRecorder.prepare(); mRecorder.start(); } } public void stop() { if (mRecorder != null) { mRecorder.stop(); mRecorder.release(); mRecorder = null; } } public double getAmplitude() { if (mRecorder != null) return mRecorder.getMaxAmplitude(); else return 0; } } 

Si desea analizar una muestra de sonido tomada directamente desde el micrófono sin guardar los datos en un archivo, debe hacer uso del objeto AudioRecord de la siguiente manera:

 int sampleRate = 8000; try { bufferSize = AudioRecord.getMinBufferSize(sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); audio = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); } catch (Exception e) { android.util.Log.e("TrackingFlow", "Exception", e); } 

Luego debes comenzar a grabar cuando estés listo:

 audio.startRecording(); 

Ahora es el momento de comenzar a leer muestras de la siguiente manera:

 short[] buffer = new short[bufferSize]; int bufferReadResult = 1; if (audio != null) { // Sense the voice... bufferReadResult = audio.read(buffer, 0, bufferSize); double sumLevel = 0; for (int i = 0; i < bufferReadResult; i++) { sumLevel += buffer[i]; } lastLevel = Math.abs((sumLevel / bufferReadResult)); 

El último código combina todas las diferentes amplitudes de las muestras y asigna el promedio a la última variableLeveL, para más detalles puede ir a esta publicación .

¡Saludos!

Jugué con algunas aplicaciones de código fuente de grabación de sonido, pero me tomó un tiempo conseguirlo.

Puedes copiar el código fuente de NoiseAlert de Google, el código de SoundMeter, que es lo que he usado.

getMaxAmplitude oscila entre 0 y 32768. El material de EMA no me molesté en usarlo.

En su actividad principal, debe declarar un objeto MediaRecorder y llamar a su función start () como Anna citado.

Para obtener más información, puede consultar mi proyecto: http://kaitagsd.wordpress.com/2013/03/25/arduino-project-amplify-part-2-ie-how-to-transmit-send-data-from -android-to-arduino-bluesmirf-silver-using-bluetooth / Donde necesitaba enviar el valor de la amplitud del sonido sobre BlueTooth.

El código exacto está aquí: https://github.com/garytse89/Amplify/tree/master/Android%20Code/src/com/garytse89/allin

Solo revise las partes que tienen algo que ver con el objeto MediaRecorder asociado.