Reproducir ficheros de sonido en java

De ChuWiki

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.