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 uneTargetDataLine
, 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 unAudioInputStream
à 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.