Android Audio
Le système d’exploitation Android offre une prise en charge étendue du multimédia, englobant à la fois l’audio et la vidéo. Ce guide se concentre sur l’audio dans Android et couvre la lecture et l’enregistrement audio à l’aide des classes intégrées du lecteur audio et de l’enregistreur, ainsi que l’API audio de bas niveau. Il couvre également l’utilisation d’événements audio diffusés par d’autres applications, afin que les développeurs puissent créer des applications bien comportementées.
Vue d’ensemble
Les appareils mobiles modernes ont adopté des fonctionnalités qui auraient auparavant requis des pièces d’équipement dédiées : caméras, lecteurs de musique et enregistreurs vidéo. En raison de cela, les infrastructures multimédias sont devenues une fonctionnalité de première classe dans les API mobiles.
Android offre une prise en charge étendue du multimédia. Cet article examine l’utilisation de l’audio dans Android et aborde les rubriques suivantes
Lecture audio avec MediaPlayer : utilisation de la classe intégrée
MediaPlayer
pour lire l’audio, y compris les fichiers audio locaux et les fichiers audio diffusés en continu avec laAudioTrack
classe.Enregistrement audio : utilisation de la classe intégrée
MediaRecorder
pour enregistrer l’audio.Utilisation des notifications audio : utilisation de notifications audio pour créer des applications bien comportementées qui répondent correctement aux événements (tels que les appels téléphoniques entrants) en suspendant ou en annulant leurs sorties audio.
Utilisation d’audio de bas niveau : lecture audio à l’aide de la
AudioTrack
classe en écrivant directement dans des mémoires tampons. Enregistrement audio à l’aide de laAudioRecord
classe et lecture directement à partir de mémoires tampons.
Spécifications
Ce guide nécessite Android 2.0 (niveau d’API 5) ou version ultérieure. Notez que le débogage audio sur Android doit être effectué sur un appareil.
Il est nécessaire de demander les RECORD_AUDIO
autorisations dans AndroidManifest.XML :
Lecture audio avec la classe MediaPlayer
La façon la plus simple de lire l’audio dans Android est avec la classe MediaPlayer intégrée.
MediaPlayer
peut lire les fichiers locaux ou distants en transmettant le chemin d’accès au fichier. Toutefois, MediaPlayer
il est très sensible à l’état et appelle l’une de ses méthodes dans un état incorrect entraîne la levée d’une exception. Il est important d’interagir avec MediaPlayer
l’ordre décrit ci-dessous pour éviter les erreurs.
Initialisation et lecture
La lecture de l’audio avec MediaPlayer
nécessite la séquence suivante :
Instanciez un nouvel objet MediaPlayer .
Configurez le fichier à lire via la méthode SetDataSource .
Appelez la méthode Prepare pour initialiser le lecteur.
Appelez la méthode Start pour démarrer la lecture audio.
L’exemple de code ci-dessous illustre cette utilisation :
protected MediaPlayer player;
public void StartPlayer(String filePath)
{
if (player == null) {
player = new MediaPlayer();
} else {
player.Reset();
player.SetDataSource(filePath);
player.Prepare();
player.Start();
}
}
Suspension et reprise de la lecture
La lecture peut être suspendue en appelant la méthode Pause :
player.Pause();
Pour reprendre la lecture suspendue, appelez la méthode Start . Cette opération reprend à partir de l’emplacement suspendu dans la lecture :
player.Start();
L’appel de la méthode Stop sur le lecteur met fin à une lecture continue :
player.Stop();
Lorsque le lecteur n’est plus nécessaire, les ressources doivent être libérées en appelant la méthode Release :
player.Release();
Utilisation de la classe MediaRecorder pour enregistrer l’audio
Le corollaire à MediaPlayer
l’enregistrement audio dans Android est la classe MediaRecorder . Comme le MediaPlayer
, il est sensible à l’état et passe par plusieurs états pour atteindre le point où il peut commencer l’enregistrement. Pour enregistrer l’audio, l’autorisation RECORD_AUDIO
doit être définie. Pour obtenir des instructions sur la définition des autorisations d’application, consultez Utilisation de AndroidManifest.xml.
Initialisation et enregistrement
L’enregistrement audio avec les MediaRecorder
étapes suivantes est nécessaire :
Instanciez un nouvel objet MediaRecorder .
Spécifiez l’appareil matériel à utiliser pour capturer l’entrée audio via la méthode SetAudioSource .
Définissez le format audio du fichier de sortie à l’aide de la méthode SetOutputFormat . Pour obtenir la liste des types audio pris en charge, consultez Les formats multimédias pris en charge par Android.
Appelez la méthode SetAudioEncoder pour définir le type d’encodage audio.
Appelez la méthode SetOutputFile pour spécifier le nom du fichier de sortie dans lequel les données audio sont écrites.
Appelez la méthode Prepare pour initialiser l’enregistreur.
Appelez la méthode Start pour démarrer l’enregistrement.
L’exemple de code suivant illustre cette séquence :
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);
}
}
Arrêt de l’enregistrement
Pour arrêter l’enregistrement, appelez la Stop
méthode sur :MediaRecorder
recorder.Stop();
Nettoyage
Une fois l’arrêt MediaRecorder
terminé, appelez la méthode Reset pour la remettre dans son état d’inactivité :
recorder.Reset();
Lorsque l’élément MediaRecorder
n’est plus nécessaire, ses ressources doivent être libérées en appelant la méthode Release :
recorder.Release();
Gestion des notifications audio
La classe AudioManager
La classe AudioManager fournit un accès aux notifications audio qui indiquent aux applications quand des événements audio se produisent. Ce service permet également d’accéder à d’autres fonctionnalités audio, telles que le contrôle en mode volume et sonnerie. L’application AudioManager
permet à une application de gérer les notifications audio pour contrôler la lecture audio.
Gestion du focus audio
Les ressources audio de l’appareil (lecteur et enregistreur intégrés) sont partagées par toutes les applications en cours d’exécution.
Conceptuellement, cela est similaire aux applications sur un ordinateur de bureau où une seule application a le focus clavier : après avoir sélectionné l’une des applications en cours d’exécution en cliquant sur celle-ci, l’entrée du clavier ne s’affiche qu’à cette application.
Le focus audio est une idée similaire et empêche plusieurs applications de lire ou d’enregistrer du contenu audio en même temps. Il est plus compliqué que le focus clavier parce qu’il est volontaire – l’application peut ignorer ce fait qu’elle n’a pas actuellement le focus audio et la lecture indépendamment – et parce qu’il existe différents types de focus audio qui peuvent être demandés. Par exemple, si le demandeur est censé lire l’audio pendant un temps très court, il peut demander le focus temporaire.
Le focus audio peut être accordé immédiatement, ou initialement refusé et accordé ultérieurement. Par exemple, si une application demande le focus audio pendant un appel téléphonique, il est refusé, mais le focus peut bien être accordé une fois l’appel téléphonique terminé. Dans ce cas, un écouteur est inscrit pour répondre en conséquence si le focus audio est retiré. La demande de focus audio est utilisée pour déterminer s’il est ok ou non de lire ou d’enregistrer du contenu audio.
Pour plus d’informations sur le focus audio, consultez Gestion du focus audio.
Inscription du rappel pour le focus audio
L’inscription du FocusChangeListener
rappel à partir de celui-ci IOnAudioChangeListener
est une partie importante de l’obtention et de la libération du focus audio. Cela est dû au fait que l’octroi du focus audio peut être différé jusqu’à une date ultérieure. Par exemple, une application peut demander de lire de la musique pendant qu’un appel téléphonique est en cours. Le focus audio ne sera pas accordé tant que l’appel téléphonique n’est pas terminé.
Pour cette raison, l’objet de rappel est passé en tant que paramètre dans la GetAudioFocus
méthode du AudioManager
, et il s’agit de cet appel qui inscrit le rappel. Si le focus audio est initialement refusé mais accordé ultérieurement, l’application est informée en appelant OnAudioFocusChange
le rappel. La même méthode est utilisée pour indiquer à l’application que le focus audio est retiré.
Une fois l’application terminée à l’aide des ressources audio, elle appelle la AbandonFocus
méthode du AudioManager
rappel, puis passe à nouveau dans le rappel. Cette opération annule le rappel et libère les ressources audio afin que d’autres applications puissent obtenir le focus audio.
Demande de focus audio
Les étapes requises pour demander les ressources audio de l’appareil sont les suivantes :
Obtenez un handle pour le
AudioManager
service système.Créez une instance de la classe de rappel.
Demandez les ressources audio de l’appareil en appelant la
RequestAudioFocus
méthode sur leAudioManager
. Les paramètres sont l’objet de rappel, le type de flux (musique, appel vocal, sonnerie, etc.) et le type du droit d’accès demandé (les ressources audio peuvent être demandées momentanément ou pendant une période indéfinie, par exemple).Si la demande est accordée, la
playMusic
méthode est appelée immédiatement et l’audio commence à lire.Si la demande est refusée, aucune autre action n’est prise. Dans ce cas, l’audio ne sera lu que si la demande est accordée ultérieurement.
L’exemple de code ci-dessous montre les étapes suivantes :
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);
}
Libération du focus audio
Une fois la lecture de la piste terminée, la AbandonFocus
méthode activée AudioManager
est appelée. Cela permet à une autre application d’obtenir les ressources audio de l’appareil. D’autres applications recevront une notification de ce changement de focus audio s’ils ont inscrit leurs propres écouteurs.
API audio de bas niveau
Les API audio de bas niveau offrent un meilleur contrôle sur la lecture et l’enregistrement audio, car elles interagissent directement avec les mémoires tampons au lieu d’utiliser des URI de fichier. Il existe certains scénarios où cette approche est préférable. Il s’agit entre autres des scénarios suivants :
Lors de la lecture à partir de fichiers audio chiffrés.
Lors de la lecture d’une succession de courts clips.
Streaming audio.
AudioTrack, classe
La classe AudioTrack utilise les API audio de bas niveau pour l’enregistrement et est l’équivalent de bas niveau de la MediaPlayer
classe.
Initialisation et lecture
Pour lire l’audio, une nouvelle instance de AudioTrack
doit être instanciée. La liste d’arguments passée dans le constructeur spécifie comment lire l’exemple audio contenu dans la mémoire tampon. Les arguments sont :
Type de flux : voix, sonnerie, musique, système ou alarme.
Fréquence : taux d’échantillonnage exprimé en Hz.
Configuration du canal : mono ou stéréo.
Format audio : encodage 8 bits ou 16 bits.
Taille de la mémoire tampon : en octets.
Mode mémoire tampon : diffusion en continu ou statique.
Après la construction, la méthode Play d’est AudioTrack
appelée pour la configurer pour commencer à jouer. L’écriture de la mémoire tampon audio dans le AudioTrack
démarrage de la lecture :
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);
}
Suspension et arrêt de la lecture
Appelez la méthode Pause pour suspendre la lecture :
audioTrack.Pause();
L’appel de la méthode Stop termine définitivement la lecture :
audioTrack.Stop();
Nettoyage
Quand elle AudioTrack
n’est plus nécessaire, ses ressources doivent être libérées en appelant Release :
audioTrack.Release();
La classe AudioRecord
La classe AudioRecord est l’équivalent du AudioTrack
côté enregistrement. Comme AudioTrack
, il utilise des mémoires tampons directement, à la place de fichiers et d’URI. L’autorisation RECORD_AUDIO
doit être définie dans le manifeste.
Initialisation et enregistrement
La première étape consiste à construire un nouvel objet AudioRecord . La liste d’arguments passée dans le constructeur fournit toutes les informations requises pour l’enregistrement. Contrairement à , AudioTrack
où les arguments sont en grande partie des énumérations, les arguments équivalents sont des entiers AudioRecord
. Il s’agit notamment des paramètres suivants :
Source d’entrée audio matérielle telle que le microphone.
Type de flux : voix, sonnerie, musique, système ou alarme.
Fréquence : taux d’échantillonnage exprimé en Hz.
Configuration du canal : mono ou stéréo.
Format audio : encodage 8 bits ou 16 bits.
Taille des mémoires tampons en octets
Une fois la AudioRecord
construction construite, sa méthode StartRecording est appelée. Il est maintenant prêt à commencer l’enregistrement. Le AudioRecord
tampon audio lit en continu la mémoire tampon audio pour l’entrée et écrit cette entrée dans un fichier 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;
}
}
}
Arrêt de l’enregistrement
L’appel de la méthode Stop met fin à l’enregistrement :
audRecorder.Stop();
Nettoyage
Lorsque l’objet AudioRecord
n’est plus nécessaire, l’appel de sa méthode Release libère toutes les ressources associées :
audRecorder.Release();
Résumé
Le système d’exploitation Android fournit une infrastructure puissante pour la lecture, l’enregistrement et la gestion de l’audio. Cet article a abordé la lecture et l’enregistrement audio à l’aide des classes et MediaRecorder
des niveaux MediaPlayer
supérieurs. Ensuite, il a exploré comment utiliser des notifications audio pour partager les ressources audio de l’appareil entre différentes applications. Enfin, il traite de la lecture et de l’enregistrement audio à l’aide des API de bas niveau, qui interface directement avec des mémoires tampons.