Reproducir ficheros de sonido en java
Para reproducir ficheros de sonido en java, tenemos la clase AudioSystem con varias utilidades que nos ayudan en esta tarea.
Para saber qué tipos de ficheros de sonido podemos reproducir, podemos usar el siguiente programita
package com.chuidiang.ejemplos.audio; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioSystem; /** * Ejemplo para obtener los tipos de ficheros de sonido soportados * @author chuidiang * http://www.chuidiang.com */ public class TiposAudio { /** * Muestra los tipos de fichero de sonido soportados * @param args */ public static void main(String[] args) { // Obtenemos los tipos AudioFileFormat.Type[] tipos = AudioSystem.getAudioFileTypes(); // y los sacamos por pantalla for (AudioFileFormat.Type tipo : tipos) System.out.println(tipo.getExtension()); } }
El método AudioSystem.getAudioFileTypes() nos devuelve los tipos de audio soportados. Basta obtenerlos y hacer un bucle para sacarlos por pantalla. El resultado con java 6 es
wav au aif
Para nuestro ejemplo elegiremos un fichero wav2.wav. Tendrás que cambiar el nombre por uno que tengas disponible si quieres probar el ejemplo.
En primero lugar, con AudioSystem.getClip() obtenemos un Clip de sonido.
Clip sonido = AudioSystem.getClip();
Este Clip tiene un método open() que admite un AudioInputStream para poder reproducirlo. Nuevamente, la clase AudioSystem con su método getAudioInputStream() nos permite obtener este AudioInputStream a partir de un File normal.
sonido.open(AudioSystem.getAudioInputStream(new File("wav2.wav"));
Una vez abierto, el método start() comenzará la reproducción del fichero de sonido
sonido.start();
El programa no debe terminar inmediatamente, puesto que si lo hace la reproducción se parará inmediatamente. Por ello, esperaremos hasta que termine. El método isRunning() de la clase Clip nos dice si todavía se está reproduciendo, así que haremos un bucle hasta que termine la reproducción
while (sonido.isRunning()) Thread.sleep(1000);
Una vez que termine, cerramos el Clip y San se acabó.
sonido.close();
El código completo de este ejemplo es el siguiente
package com.chuidiang.ejemplos.audio; import java.io.File; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; /** * Ejemplo de reproducción de ficheros de sonido. * @author chuidiang * http://www.chuidiang.com */ public class ReproduceAudio { /** * Abre un fichero de sonido wav y lo reproduce * @param args */ public static void main(String[] args) { try { // Se obtiene un Clip de sonido Clip sonido = AudioSystem.getClip(); // Se carga con un fichero wav sonido.open(AudioSystem.getAudioInputStream(new File("wav2.wav"))); // Comienza la reproducción sonido.start(); // Espera mientras se esté reproduciendo. while (sonido.isRunning()) Thread.sleep(1000); // Se cierra el clip. sonido.close(); } catch (Exception e) { System.out.println("" + e); } } }
Además del método start() de Clip, tenemos el método loop() que repdroduce el fichero un número determinado de veces.
sonido.loop(0); // Reproduce el fichero de sonido una vez sonido.loop(1); // reproduce el fichero de sonido dos veces sonido.loop(n); // reproduce el fichero de sonido n+1 veces sonido.loop(Clip.LOOP_CONTINUOUSLY); // reproduce el fichero de sonido una y otra vez sin parar.