l'API Java Sound

Exemple: Un simple enregistreur audio

L'ensemble des sources de cette présentation est disponible ici.
Écrire un simple enregistreur audio, permettant d'enregistrer dans un fichier le flux audio capturé sur l'entrée micro est relativement simple. L'objet de cette section sera la réalisation d'un tel enregistreur. Le code ci-après est extrait et remanié à partir des classes AudioRecorder et AudioRecorderPlayerGUI disponible dans les sources.

Définition du format audio de capture et d’enregistrement

Contrairement à l'exemple du lecteur où le format audio était récupéré à partir du fichier, il faut ici créer soi-même le format audio. Ici on choisi un encodage PCM (valeur par défaut) avec une fréquence d' échantillonnage de 44100KHz 2 canaux, une taille d'échantillon 16 bits, codage signé, ordre des octets Big Endian.


//AudioFormat(float sampleRate, int sampleSizeInBits,
// int channels, boolean signed, boolean bigEndian)

audioFormat = new AudioFormat(44100,16,2,true,true);

Construction d’un Objet DataLine.Info

On crée un descripteur de ligne en précisant le type de ligne qu'on veut (on enregistre donc TargetDataLine) et le format audio construit précédemment.
On teste également si le système supporte le type de ligne que l'on souhaite obtenir.


DataLine.Info info = new DataLine.Info(TargetDataLine.class,
                audioFormat);
if (!AudioSystem.isLineSupported(info)) {
  System.err.println("Audio Format specified is not supported");
  return;
}

Récupération de l’objet Line souhaité

Cette fois on veut une TargetDataLine, il faut typer la ligne obtenue.


// On récupère le DataLine adéquat
try {
line = (TargetDataLine) AudioSystem.getLine(info);

} catch (LineUnavailableException e) { 
  e.printStackTrace();
  return;
}

Ouverture de la ligne avec le format audio spécifié


try {
line.open(audioFormat);
} catch (LineUnavailableException e1) {
e1.printStackTrace();
return;
}

Démarrage de la ligne


line.start();

Lecture du flux et écriture dans un fichier cible

Le format de fichier cible doit être spécifié, on utilisera ici le type WAVE redéfini. On construit un AudioInputStream à partir de la TargetDataLine dont nous disposons. On peut ensuite écrire dans le fichier destination file grâce à la méthode AudioSystem.write(AudioInputStream a,AudioFileFormat.Type type, File file).


 AudioFileFormat.Type targetType = AudioFileFormat.Type.WAVE;
 AudioInputStream audioInputStream=new AudioInputStream(line);
 try {
   AudioSystem.write(audioInputStream,targetType, file);
 } catch (IOException e1) {
    e1.printStackTrace();
 } finally {
    line.close();
    try {
       audioInputStream.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
 }
La lecture se fait tant que la ligne n'est pas explicitement arrêtée.

Valid XHTML 1.0!