Android Audio
El sistema operativo Android proporciona una amplia compatibilidad con multimedia, que abarca audio y vídeo. Esta guía se centra en el audio en Android y abarca la reproducción y grabación de audio mediante las clases de grabadora y reproductor de audio integradas, así como la API de audio de bajo nivel. También se trata el trabajo con eventos de audio difundidos por otras aplicaciones, para que los desarrolladores puedan crear aplicaciones bien comportadas.
Información general
Los dispositivos móviles modernos han adoptado una funcionalidad que anteriormente requería equipos dedicados: cámaras, reproductores de música y grabadoras de vídeo. Por este problema, los marcos multimedia se han convertido en una característica de primera clase en las API móviles.
Android proporciona una amplia compatibilidad con multimedia. En este artículo se examina el trabajo con audio en Android y se tratan los temas siguientes.
Reproducir audio con MediaPlayer: use la clase integrada para reproducir audio, incluidos los archivos de audio locales y los archivos de audio transmitidos con la
AudioTrackclase .Grabación de audio: uso de la clase integrada para grabar audio.
Trabajar con notificaciones de audio: el uso de notificaciones de audio para crear aplicaciones bien comportadas que respondan correctamente a eventos (como llamadas telefónicas entrantes) suspendiendo o cancelando sus salidas de audio.
Trabajar con Low-Level audio: reproducir audio mediante la clase escribiendo directamente en búferes de memoria. Grabación de audio mediante la
AudioRecordclase y lectura directa desde búferes de memoria.
Requisitos
Esta guía requiere Android 2.0 (nivel de API 5) o superior. Tenga en cuenta que la depuración de audio en Android debe realizarse en un dispositivo.
Es necesario solicitar los RECORD_AUDIO permisos RECORD_AUDIOenAndroidManifest.XML:

Reproducir audio con la clase MediaPlayer
La manera más sencilla de reproducir audio en Android es con la clase MediaPlayer integrada.
MediaPlayer puede reproducir archivos locales o remotos pasando la ruta de acceso del archivo. Sin embargo, es muy sensible al estado y llamar a uno de sus métodos en un estado incorrecto provocará que se produce MediaPlayer una excepción. Es importante interactuar con en el orden descrito MediaPlayer a continuación para evitar errores.
Inicialización y reproducción
La reproducción de audio MediaPlayer con requiere la siguiente secuencia:
Cree una instancia de un nuevo objeto MediaPlayer.
Configure el archivo para reproducirlo mediante el método SetDataSource.
Llame al método Prepare para inicializar el reproductor.
Llame al método Start para iniciar la reproducción de audio.
En el ejemplo de código siguiente se muestra este uso:
protected MediaPlayer player;
public void StartPlayer(String filePath)
{
if (player == null) {
player = new MediaPlayer();
} else {
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
}
Suspender y reanudar la reproducción
La reproducción se puede suspender llamando al método Pause:
player.Pause();
Para reanudar la reproducción en pausa, llame al método Start. Esto se reanudará desde la ubicación en pausa en la reproducción:
player.Start();
Al llamar al método Stop en el reproductor, finaliza una reproducción en curso:
player.Stop();
Cuando el reproductor ya no sea necesario, los recursos deben liberarse mediante una llamada al método Release:
player.Release();
Usar la clase MediaRecorder para grabar audio
El corolario para MediaPlayer grabar audio en Android es la clase MediaPlayer Al igual que , es sensible al estado y pasa a través de varios estados para llegar al punto MediaPlayer donde puede empezar a grabar. Para grabar audio, se RECORD_AUDIO debe establecer el permiso. Para obtener instrucciones sobre cómo establecer permisos de aplicación, vea Trabajar con AndroidManifest.xml.
Inicialización y grabación
La grabación de audio con MediaRecorder requiere los pasos siguientes:
Cree una instancia de un nuevo objeto MediaRecorder.
Especifique el dispositivo de hardware que se usará para capturar la entrada de audio mediante el método SetAudioSource.
Establezca el formato de audio del archivo de salida mediante el método SetOutputFormat. Para obtener una lista de los tipos de audio admitidos, vea Formatos multimedia compatibles con Android.
Llame al método SetAudioEncoder para establecer el tipo de codificación de audio.
Llame al método SetOutputFile para especificar el nombre del archivo de salida en el que se escriben los datos de audio.
Llame al método Prepare para inicializar la grabadora.
Llame al método Start para iniciar la grabación.
En el ejemplo de código siguiente se muestra esta secuencia:
protected MediaRecorder recorder;
void RecordAudio (String filePath)
{
try {
if (File.Exists (filePath)) {
File.Delete (filePath);
}
if (recorder == null) {
recorder = new MediaRecorder (); // Initial state.
} else {
recorder.Reset ();
recorder.SetAudioSource (AudioSource.Mic);
recorder.SetOutputFormat (OutputFormat.ThreeGpp);
recorder.SetAudioEncoder (AudioEncoder.AmrNb);
// Initialized state.
recorder.SetOutputFile (filePath);
// DataSourceConfigured state.
recorder.Prepare (); // Prepared state
recorder.Start (); // Recording state.
}
} catch (Exception ex) {
Console.Out.WriteLine( ex.StackTrace);
}
}
Detención de la grabación
Para detener la grabación, llame al Stop método en MediaRecorder :
recorder.Stop();
Limpiar
Una vez detenido, llame al método Reset para volver a ponerlo MediaRecorder en su estado de inactividad: MediaRecorder
recorder.Reset();
Cuando ya MediaRecorder no se necesite, sus recursos deben liberarse mediante una llamada al MediaRecorder
recorder.Release();
Administración de notificaciones de audio
La clase AudioManager
La clase AudioManager proporciona acceso a las notificaciones de audio que permiten a las aplicaciones saber cuándo se producen eventos de audio. Este servicio también proporciona acceso a otras características de audio, como el control de volumen y modo de timbre. permite AudioManager que una aplicación controle las notificaciones de audio para controlar la reproducción de audio.
Administración del foco de audio
Todas las aplicaciones en ejecución comparten los recursos de audio del dispositivo (el reproductor y la grabadora integrados).
Conceptualmente, esto es similar a las aplicaciones de un equipo de escritorio donde solo una aplicación tiene el foco de teclado: después de seleccionar una de las aplicaciones en ejecución haciendo clic con el mouse en él, la entrada de teclado solo va a esa aplicación.
El foco de audio es una idea similar e impide que más de una aplicación re reproduce o graba audio al mismo tiempo. Es más complicado que el foco de teclado porque es voluntaria (la aplicación puede omitir ese hecho de que actualmente no tiene el foco y la reproducción de audio independientemente) y porque hay diferentes tipos de foco de audio que se pueden solicitar. Por ejemplo, si solo se espera que el solicitante reprodúce audio durante un tiempo muy corto, puede solicitar el foco transitorio.
El foco de audio se puede conceder inmediatamente o denegarse inicialmente y concederse más adelante. Por ejemplo, si una aplicación solicita el foco de audio durante una llamada telefónica, se denegará, pero es posible que se conceda el foco una vez finalizada la llamada telefónica. En este caso, se registra un agente de escucha para responder en consecuencia si se quita el foco de audio. La solicitud de foco de audio se usa para determinar si es correcto reproducir o grabar audio.
Para obtener más información sobre el foco de audio, vea Managing Audio Focus.
Registro de la devolución de llamada para el foco de audio
Registrar la devolución de llamada desde es una parte importante de FocusChangeListenerIOnAudioChangeListener la obtención y liberación del foco de audio. Esto se debe a que la concesión de foco de audio se puede aplazar hasta un momento posterior. Por ejemplo, una aplicación puede solicitar reproducir música mientras hay una llamada telefónica en curso. El foco de audio no se concederá hasta que finalice la llamada telefónica.
Por este motivo, el objeto de devolución de llamada se pasa como un parámetro al método de y es esta llamada la que GetAudioFocusAudioManager registra la devolución de llamada. Si se deniega inicialmente el foco de audio, pero posteriormente se concede, se informa a la aplicación mediante la invocación OnAudioFocusChange de la devolución de llamada. Se usa el mismo método para decir a la aplicación que se está quitando el foco de audio.
Cuando la aplicación ha terminado de usar los recursos de audio, llama al método de y vuelve a AbandonFocusAudioManager pasar la devolución de llamada. Esto anula el registro de la devolución de llamada y libera los recursos de audio, para que otras aplicaciones puedan obtener el foco de audio.
Solicitud del foco de audio
Los pasos necesarios para solicitar los recursos de audio del dispositivo son los siguientes:
Obtenga un identificador para el
AudioManagerservicio del sistema.Cree una instancia de la clase de devolución de llamada.
Solicite los recursos de audio del dispositivo llamando al
RequestAudioFocusmétodo enAudioManager. Los parámetros son el objeto de devolución de llamada, el tipo de secuencia (música, llamada de voz, anillo, etc.). y el tipo de derecho de acceso que se solicita (los recursos de audio se pueden solicitar momentáneamente o durante un período indefinido, por ejemplo).Si se concede la solicitud, el
playMusicmétodo se invoca inmediatamente y el audio comienza a reproducirse.Si se deniega la solicitud, no se toma ninguna otra acción. En este caso, el audio solo se reproducirá si la solicitud se concede más adelante.
En el ejemplo de código siguiente se muestran estos pasos:
Boolean RequestAudioResources(INotificationReceiver parent)
{
AudioManager audioMan = (AudioManager) GetSystemService(Context.AudioService);
AudioManager.IOnAudioFocusChangeListener listener = new MyAudioListener(this);
var ret = audioMan.RequestAudioFocus (listener, Stream.Music, AudioFocus.Gain );
if (ret == AudioFocusRequest.Granted) {
playMusic();
return (true);
} else if (ret == AudioFocusRequest.Failed) {
return (false);
}
return (false);
}
Liberar el foco de audio
Una vez completada la reproducción de la pista, AbandonFocus se invoca el método AudioManager on. Esto permite que otra aplicación obtenga los recursos de audio del dispositivo. Otras aplicaciones recibirán una notificación de este cambio de foco de audio si han registrado sus propios agentes de escucha.
API de audio de bajo nivel
Las API de audio de bajo nivel proporcionan un mayor control sobre la reproducción y grabación de audio porque interactúan directamente con los búferes de memoria en lugar de usar URI de archivo. Hay algunos escenarios en los que es preferible este enfoque. Entre los escenarios se incluyen los siguientes:
Al reproducir desde archivos de audio cifrados.
Al reproducir una sucesión de clips cortos.
Streaming de audio.
AudioTrack (clase)
La clase AudioTrack usa las API de audio de bajo nivel para la grabación y es el equivalente de bajo nivel de la clase.
Inicialización y reproducción
Para reproducir audio, se debe crear una instancia AudioTrack nueva de . La lista de argumentos que se pasa al constructor especifica cómo reproducir la muestra de audio contenida en el búfer. Los argumentos son:
Tipo de secuencia: voz, sonido, música, sistema o alarma.
Frecuencia: frecuencia de muestreo expresada en Hz.
Configuración del canal: mono o estéreo.
Formato de audio: codificación de 8 o 16 bits.
Tamaño del búfer: en bytes.
Modo de búfer: streaming o estático.
Después de la construcción, se invoca el método Play de para configurarlo para que empiece a reproducirse. Al escribir el búfer de audio en AudioTrack , se inicia la reproducción:
void PlayAudioTrack(byte[] audioBuffer)
{
AudioTrack audioTrack = new AudioTrack(
// Stream type
Stream.Music,
// Frequency
11025,
// Mono or stereo
ChannelOut.Mono,
// Audio encoding
Android.Media.Encoding.Pcm16bit,
// Length of the audio clip.
audioBuffer.Length,
// Mode. Stream or static.
AudioTrackMode.Stream);
audioTrack.Play();
audioTrack.Write(audioBuffer, 0, audioBuffer.Length);
}
Pausar y detener la reproducción
Llame al método Pause para pausar la reproducción:
audioTrack.Pause();
Al llamar al método Stop, se finalizará la reproducción de forma permanente:
audioTrack.Stop();
Limpieza
Cuando ya AudioTrack no se necesite, sus recursos deben liberarse mediante una llamada a AudioTrack:
audioTrack.Release();
La clase AudioRecord
La clase AudioRecord es el equivalente de en el lado de la grabación. Al AudioTrack igual que , usa búferes de memoria directamente, en lugar de archivos e URI. Requiere que el RECORD_AUDIO permiso se establezca en el manifiesto.
Inicialización y grabación
El primer paso consiste en construir un nuevo objeto AudioRecord. La lista de argumentos que se pasa al constructor proporciona toda la información necesaria para la grabación. A diferencia de en , donde los argumentos son en gran medida AudioTrack enumeraciones, los argumentos equivalentes en AudioRecord son enteros. Entre ellas se incluyen las siguientes:
Origen de entrada de audio de hardware, como micrófono.
Tipo de secuencia: voz, sonido, música, sistema o alarma.
Frecuencia: frecuencia de muestreo expresada en Hz.
Configuración del canal: mono o estéreo.
Formato de audio: codificación de 8 o 16 bits.
Bytes de tamaño en búfer
Una vez AudioRecord construido , se invoca su método AudioRecord Ahora está listo para comenzar la grabación. lee continuamente el búfer de audio para la entrada AudioRecord y escribe esta entrada en un archivo de audio.
void RecordAudio()
{
byte[] audioBuffer = new byte[100000];
var audRecorder = new AudioRecord(
// Hardware source of recording.
AudioSource.Mic,
// Frequency
11025,
// Mono or stereo
ChannelIn.Mono,
// Audio encoding
Android.Media.Encoding.Pcm16bit,
// Length of the audio clip.
audioBuffer.Length
);
audRecorder.StartRecording();
while (true) {
try
{
// Keep reading the buffer while there is audio input.
audRecorder.Read(audioBuffer, 0, audioBuffer.Length);
// Write out the audio file.
} catch (Exception ex) {
Console.Out.WriteLine(ex.Message);
break;
}
}
}
Detención de la grabación
Al llamar al método Stop se finaliza la grabación:
audRecorder.Stop();
Limpieza
Cuando el objeto ya no es necesario, al llamar a AudioRecord su AudioRecord se liberan todos los recursos asociados a él:
audRecorder.Release();
Resumen
El sistema operativo Android proporciona un marco eficaz para reproducir, grabar y administrar audio. En este artículo se ha abordado cómo reproducir y grabar audio mediante las clases MediaPlayer y de MediaRecorder alto nivel. A continuación, se ha explorado cómo usar las notificaciones de audio para compartir los recursos de audio del dispositivo entre distintas aplicaciones. Por último, se ha abordado cómo reproducir y grabar audio mediante las API de bajo nivel, que se interfazn directamente con los búferes de memoria.