Android: Necesidad de registrar la entrada de micrófono

¿Hay una manera de grabar entrada de micrófono en android mientras se está procesando para la reproducción / previsualización en tiempo real? He intentado utilizar AudioRecord y AudioTrack para hacer esto pero el problema es que mi dispositivo no puede jugar el archivo audio registrado. En realidad, cualquier aplicación de reproductor de android no puede reproducir el archivo de audio grabado.

Por otro lado, el uso de Media.Recorder para grabar genera un buen archivo de audio grabado que puede ser reproducido por cualquier aplicación de reproductor. Pero la cosa es que no puedo hacer una vista previa / palyback mientras graba la entrada de micrófono en tiempo real.

Cualquier comentario es muy apreciado! ¡Gracias por adelantado!

Para grabar y reproducir audio en (casi) tiempo real puede iniciar un hilo separado y utilizar AudioRecord y AudioTrack .

Sólo tenga cuidado con la retroalimentación. Si los altavoces se activan lo suficientemente alto en su dispositivo, la retroalimentación puede ser bastante desagradable bastante rápido.

 /* * Thread to manage live recording/playback of voice input from the device's microphone. */ private class Audio extends Thread { private boolean stopped = false; /** * Give the thread high priority so that it's not canceled unexpectedly, and start it */ private Audio() { android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); start(); } @Override public void run() { Log.i("Audio", "Running Audio Thread"); AudioRecord recorder = null; AudioTrack track = null; short[][] buffers = new short[256][160]; int ix = 0; /* * Initialize buffer to hold continuously recorded audio data, start recording, and start * playback. */ try { int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT); recorder = new AudioRecord(AudioSource.MIC, 8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10); track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM); recorder.startRecording(); track.play(); /* * Loops until something outside of this thread stops it. * Reads the data from the recorder and writes it to the audio track for playback. */ while(!stopped) { Log.i("Map", "Writing new data to buffer"); short[] buffer = buffers[ix++ % buffers.length]; N = recorder.read(buffer,0,buffer.length); track.write(buffer, 0, buffer.length); } } catch(Throwable x) { Log.w("Audio", "Error reading voice audio", x); } /* * Frees the thread's resources after the loop completes so that it can be run again */ finally { recorder.stop(); recorder.release(); track.stop(); track.release(); } } /** * Called from outside of the thread in order to stop the recording/playback loop */ private void close() { stopped = true; } } 

EDITAR

El audio no está grabando en un archivo. El objeto AudioRecord codifica el audio como datos PCM de 16 bits y lo coloca en un búfer. A continuación, el objeto AudioTrack lee los datos de ese búfer y lo reproduce a través de los altavoces. No hay ningún archivo en la tarjeta SD a la que pueda acceder más tarde.

Usted no puede leer y escribir un archivo de la tarjeta SD al mismo tiempo para obtener la reproducción / vista previa en tiempo real, por lo que tiene que utilizar los búferes.

El permiso siguiente en el manifiesto se requiere para trabajar correctamente:

 <uses-permission android:name="android.permission.RECORD_AUDIO" ></uses-permission> 

Además, 2d matriz de búfer no es necesario. La lógica del código es válida incluso con un solo búfer, como esto:

 short[] buffer = new short[160]; while (!stopped) { //Log.i("Map", "Writing new data to buffer"); int n = recorder.read(buffer, 0, buffer.length); track.write(buffer, 0, n); } 
  • Necesita un ejemplo sencillo para la grabación de audio
  • Escritura de datos grabados PCM en un archivo .wav (java android)
  • Android AudioRecord leer siempre devuelve -3 (ERROR_INVALID_OPERATION)
  • Android AudioRecord clase - proceso de mic audio en vivo rápidamente, configurar la función de devolución de llamada
  • AudioRecord y AudioTrack latency
  • Entrada y salida de audio inmediatas Android
  • La inicialización de Android AudioRecord falla cada vez
  • Obtener ultrasonido de android usando frecuencia
  • No se puede acceder al micrófono cuando otra aplicación lo está utilizando en Android
  • Emitir codificación y decodificación de una grabación de audio al formato G711 (PCMU - uLaw)
  • Android: valor recomendado de bufferSizeInBytes en AudioRecord
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.