La clase MediaRecorder, proporcionada por el SDK de Android, es la herramienta principal para grabar audio y video. Generalmente, se utiliza el micrófono del dispositivo para capturar audio y la cámara para la imagen. Aunque MediaRecorder facilita la grabación de audio, ofrece un control limitado sobre el flujo de audio. Este artículo se centrará exclusivamente en la grabación de audio.
Flujo de Implementación
- Solicitar permisos necesarios.
- Instanciar
MediaRecorder. - Configurar
MediaRecorder. - Iniciar la grabación.
- Detener la grabación.
- Pausar y reanudar la grabación.
- Liberar recursos.
Obtener Permisos
Es crucial incluir los siguientes pemrisos en el archivo AndroidManifest.xml:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Nota: A partir de Android 5.0 (API nivel 21), se requiere la solicitud dinámica de permisos en tiempo de ejecución.
Instanciar MediaRecorder
Se crea una instancia de la clase MediaRecorder.
private MediaRecorder grabadorAudio;
private void inicializarGrabadorAudio(){
grabadorAudio = new MediaRecorder();
}
Configurar MediaRecorder
Antes de iniciar la grabación, es necesario configurar los parámetros del MediaRecorder. Cada grabación, o después de una pausa y reinicio, puede requerir una reconfiguración.
private void configurarGrabadorAudio(){
// Define el archivo de salida (ejemplo: en el caché externo)
File archivoAudio = new File(getExternalCacheDir(), "grabacion.amr");
if (archivoAudio.exists()) {
archivoAudio.delete(); // Elimina el archivo si ya existe
}
// Configura la fuente de audio (micrófono)
grabadorAudio.setAudioSource(MediaRecorder.AudioSource.MIC);
// Configura el formato de salida (ejemplo: AMR Narrowband)
grabadorAudio.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
// Configura el codificador de audio (ejemplo: AMR Narrowband)
// Nota: AMR_NB es comúnmente soportado en dispositivos móviles.
grabadorAudio.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
// Configura la ruta del archivo de salida
grabadorAudio.setOutputFile(archivoAudio.getAbsolutePath());
// Configura el listener para errores
grabadorAudio.setOnErrorListener(new MediaRecorder.OnErrorListener() {
@Override
public void onError(MediaRecorder mr, int what, int extra) {
// Manejo de errores: detiene y libera recursos
if (grabadorAudio != null) {
grabadorAudio.stop();
grabadorAudio.release();
grabadorAudio = null;
}
}
});
// Configura el listener para información (opcional)
grabadorAudio.setOnInfoListener(new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mr, int what, int extra) {
// Manejo de información
}
});
}
Importante: La configuración de los parámetros tiene un orden estricto. Generalmente, el orden es: fuente de audio, formato y codificador de audio, parámetros adicionales (límite de tamaño/duración, bitrate), ruta del archivo de salida y finalmente los listeners.
Iniciar Grabación
Una vez configurado, se prepara y se inicia la grabación.
private void iniciarGrabacion(){
if (grabadorAudio != null) {
try {
grabadorAudio.prepare(); // Prepara el grabador
grabadorAudio.start(); // Inicia la grabación
} catch (IOException e) {
e.printStackTrace();
}
}
}
Nota: Asegúrate de llamar a configurarGrabadorAudio() antes de iniciarGrabacion().
Ejemplo de uso en un botón:
botonIniciar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
inicializarGrabadorAudio(); // Asegurarse de que hay una instancia
configurarGrabadorAudio();
iniciarGrabacion();
}
});
Detener Grabación
El método stop() detiene la grabación y luego reset() pone el grabador en un estado de inactividad, requiriendo una reconfiguración para un nuevo uso.
private void detenerGrabacion(){
if (grabadorAudio != null) {
grabadorAudio.stop(); // Detiene la grabación
grabadorAudio.reset(); // Reinicia el grabador (requiere reconfiguración)
}
}
Pausar y Reanudar Grabación
Para pausar y reanudar la grabación, se utilizan los métodos pause() y resume(), disponibles a partir de la API nivel 24 (Android 7.0).
// Pausar grabación
private void pausarGrabacion(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (grabadorAudio != null) {
grabadorAudio.pause(); // Pausa la grabación
}
}
}
// Reanudar grabación
private void reanudarGrabacion(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
if (grabadorAudio != null) {
grabadorAudio.resume(); // Reanuda la grabación
}
}
}
Liberar Recursos
Es fundamental liberar los recursos del MediaRecorder cuando ya no se necesite para evitar fugas de memoria y permitir que otras aplicaciones accedan al micrófono.
private void liberarRecursos(){
if (grabadorAudio != null) {
grabadorAudio.stop(); // Detener si está grabando
grabadorAudio.release(); // Libera los recursos del sistema
grabadorAudio = null; // Anula la referencia
}
}
Advertencia: Invocar stop() inmediatamente después de start() puede lanzar una RuntimeException. Para manejar clics rápidos o secuencias de grabación, considera implementar un pequeño retraso o capturar esta excepción.
APIs Relevantes para Grabación de Audio
setAudioSource(int audio_source)
Define la fuente del audio. Generalmente se usa MediaRecorder.AudioSource.MIC para el micrófono del dispositivo.
setOutputFormat(int output_format)
Especifica el formato del archivo de salida. Algunas opciones comunes son:
MediaRecorder.OutputFormat.AMR_NB: Formato AMR de banda estrecha, común para voz.MediaRecorder.OutputFormat.AAC_ADTS: Formato AAC (Audio Advanced Coding), ampliamente utilizado.MediaRecorder.OutputFormat.MPEG_4: Formato MP4.
Otras opciones incluyen 3GP, RAW_AMR, AMR_WB, AAC_ADIF, OUTPUT_FORMAT_RTP_AVP, MPEG_2_TS, WEBM.
setAudioEncoder(int audio_encoder)
Establece el códec para codificar el audio. La disponibilidad de códecs puede variar entre dispositivos.
Opciones comunes:
MediaRecorder.AudioEncoder.AMR_NB: Codificador AMR de banda estrecha.MediaRecorder.AudioEncoder.AAC: Codificador AAC (Low Complexity).MediaRecorder.AudioEncoder.HE_AAC: Codificador HE-AAC (High Efficiency).
Otros codificadores disponibles son DEFAULT, AMR_WB, AAC_ELD, VORBIS.
setOutputFile(String path) o setOutputFile(File file)
Define la ruta y el nombre del archivo donde se guardará la grabación. El método setOutputFile(File file) requiere API nivel 26.
setAudioEncodingBitRate(int bitRate)
Ajusta la tasa de bits del audio (en bits por segundo). Una tasa de bits más alta generalmente resulta en una mayor calidad de audio, pero también en un tamaño de archivo mayor.
setMaxFileSize(long max_filesize_bytes)
Establece un tamaño máximo para el archivo de grabación (en bytes). La grabación se detendrá cuando se alcance este límite.
setMaxDuration(int max_duration_ms)
Define la duración máxima de la grabación (en milisegundos). La grabación se detendrá al alcanzar este tiempo.
setOnErrorListener(OnErrorListener l)
Asigna un listener para recibir notificaciones sobre errores durante la grabación.
setAudioChannels(int numChannels)
Configura el número de canales de audio. Comúnmente se usa 1 para mono y 2 para estéreo.
setOnInfoListener(OnInfoListener listener)
Permite registrar un listener para recibir información sobre eventos durante la grabación, como la aproximación o el alcance del tamaño máximo de archivo, o el agotamiento de la duración máxima.
Algunos códigos de información improtantes:
MediaRecorder.MEDIA_RECORDER_INFO_MAX_DURATION_REACHED: Se alcanzó la duración máxima.MediaRecorder.MEDIA_ERROR_SERVER_DIED: El servidor multimedia ha muerto; se requiere reiniciar elMediaRecorder.MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED: Se alcanzó el tamaño máximo de archivo.MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_APPROACHING: Se ha alcanzado el 90% del tamaño máximo de archivo.