Cómo grabar audio usando api de audio en Android?

Tengo un teléfono Android de LG con la versión 2.3.3. Necesito conectar un micrófono en la toma de auriculares porque quiero crear una aplicación que lea muestras de sonido.

¿Cómo puedo leer las muestras mediante programación ?.

Si realmente quieres leer AudioSamples, te sugiero que uses AudioRecord en lugar de MediaRecorder ya que te da más control sobre AudioSamples … Para eso puedes usar el siguiente código, AudioCapturer es mi clase wrapper que utilizo para obtener las muestras de AudioRecord objeto .. AudioReceiver es una interfaz que tiene métodos para manejar datos de audio.

public class AudioCapturer implements Runnable { private AudioRecord audioRecorder = null; private int bufferSize; private int samplePerSec = 16000; private String LOG_TAG = "AudioCapturer"; private Thread thread = null; private boolean isRecording; private static AudioCapturer audioCapturer; private IAudioReceiver iAudioReceiver; private AudioCapturer(IAudioReceiver audioReceiver) { this.iAudioReceiver = audioReceiver; } public static AudioCapturer getInstance(IAudioReceiver audioReceiver) { if (audioCapturer == null) { audioCapturer = new AudioCapturer(audioReceiver); } return audioCapturer; } public void start() { bufferSize = AudioRecord.getMinBufferSize(samplePerSec, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); if (bufferSize != AudioRecord.ERROR_BAD_VALUE && bufferSize != AudioRecord.ERROR) { audioRecorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, this.samplePerSec, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, this.bufferSize * 10); // bufferSize // 10x if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { Log.i(LOG_TAG, "Audio Recorder created"); audioRecorder.startRecording(); isRecording = true; thread = new Thread(this); thread.start(); } else { Log.e(LOG_TAG, "Unable to create AudioRecord instance"); } } else { Log.e(LOG_TAG, "Unable to get minimum buffer size"); } } public void stop() { isRecording = false; if (audioRecorder != null) { if (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { // System.out // .println("Stopping the recorder inside AudioRecorder"); audioRecorder.stop(); } if (audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { audioRecorder.release(); } } } public boolean isRecording() { return (audioRecorder != null) ? (audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) : false; } @Override public void run() { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); while (isRecording && audioRecorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { short[] tempBuf = new short[Constants.FRAME_SIZE / 2]; audioRecorder.read(tempBuf, 0, tempBuf.length); iAudioReceiver.capturedAudioReceived(tempBuf, false); } } /* * (non-Javadoc) * * @see java.lang.Object#finalize() */ @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("AudioCapturer finalizer"); if (audioRecorder != null && audioRecorder.getState() == AudioRecord.STATE_INITIALIZED) { audioRecorder.stop(); audioRecorder.release(); } audioRecorder = null; iAudioReceiver = null; thread = null; } } 

Ahora puedes usar el objeto de esta clase de la clase Main de tu programa y comenzará a darte muestras de audio que puedes manejar dentro de tu IAudioReceiver (clase que usa estas muestras).

Si todavía quieres usar MediaRecorder, este enlace puede ser útil para ti,

2) ¿Cómo puedo leer las muestras mediante programación?

Que yo sepa, En Android puedes grabar audio usando una de estas dos clases:

  • Clase MediaRecorder

    Se utiliza para grabar audio y video. El control de grabación se basa en una simple máquina de estado

  • Clase AudioRecord

    La clase AudioRecord gestiona los recursos de audio para las aplicaciones Java para grabar audio desde el hardware de entrada de audio de la plataforma. Esto se consigue "tirando" (lectura) de los datos del objeto AudioRecord. La aplicación es responsable de sondear el objeto AudioRecord a tiempo usando uno de los tres métodos siguientes: read (byte [], int, int), read (short [], int, int) o read (ByteBuffer, int). La elección del método a utilizar se basará en el formato de almacenamiento de datos de audio que es el más conveniente para el usuario de AudioRecord.

Ps: Siga estos enlaces arriba para leer y entender el que mejor se adapte a sus necesidades.


1) ¿Qué micrófono me recomienda?

Como he mencionado en el comentario colocado en su pregunta, esto obtiene fuera de tema aquí en stackoverflow, pero con el propósito de integridad:

  • ¿Cómo utilizo un micrófono externo con mi Galaxy Nexus?

  • ¿Algún éxito con micrófonos externos para teléfonos o tabletas Android?

  • La inicialización de Android AudioRecord falla cada vez
  • El micrófono Android no funciona cuando se utiliza por otra aplicación en el servicio de fondo
  • Forzar el sonido de salida al altavoz interno mientras los auriculares están conectados
  • Nivel de ruido de consulta en Android
  • Android: Manipulando voz en llamadas telefónicas
  • ¿Cómo se activa una entrada de micrófono en el emulador de Android
  • Calcular el nivel de sonoridad desde el micrófono en android
  • Android: Valor de amplitud para el valor Decibel?
  • Cómo simular la entrada de audio a micrófono utilizando el archivo .wav
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.