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 ?.
- Cómo acceder al segundo micrófono Android como Galaxy 3
- Cancelación de eco acústico con Adobe Air en móvil
- Desactivar la cancelación de ruido de HTC
- ¿Cómo funciona la cancelación de ruido en android?
- Android, ¿Cómo usar el micrófono para calcular las frecuencias de sonido?
- Android: forzar el micrófono externo (entrada jack 3,5 mm) para permanecer en
- Usa micrófono en varias aplicaciones simultáneamente en Android
- Cómo aumentar el nivel de volumen de micrófono en Android PJSIP?
- ¿Cómo liberar el recurso de micrófono cuando otra aplicación de Android lo necesita?
- Micrófono Android para recoger un tono específico
- Cómo grabar sonido usando micrófono incorporado en android
- Problemas de liberación del micrófono interno
- Entrada y salida de audio inmediatas Android
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?
- Android: Cómo capturar o redirigir los registros de LogCat a un archivo mediante ECLIPSE IDE
- Escribir / leer datos de registro en el archivo en android