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.
- Mala calidad de sonido al grabar / reproducir sonidos - SDK de Android
- ¿El mejor método para roscar en Android?
- AudioFlinger no pudo crear pista de grabación, estado: -1, Necesita ayuda para ifx
- Grabación .Wav con Android AudioRecorder
- Errores al grabar sonido en Android
Cualquier comentario es muy apreciado! ¡Gracias por adelantado!
- Android grabación y reproducción + altavoz como una opción
- Codificación de audio AAC utilizando AudioRecord y MediaCodec en Android
- Grabar con AudioRecord en Android acelera el audio?
- Creación de un archivo WAV a partir de datos PCM sin procesar utilizando el SDK de Android
- ¿Puede Android Emulator recoger audio?
- AudioRecord - archivo PCM de escritura
- AudioRecord registra sonido intermitente en Android L Vista previa del desarrollador
- FFT de audio Android para recuperar la magnitud de frecuencia específica mediante audiorecord
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); }
- Error de libpng: No es un archivo PNG Error al mostrar en Android Studio
- Cómo obtiene "android:" valores de etiqueta en una vista personalizada