lunes, 4 de agosto de 2014

Reproducir sonido en segundo plano usando hilos en java

Es posible que necesiten reproducir algún sonido en alguna de sus aplicaciones. Hace poco estaba desarrollando un juego en java, y necesitaba reproducir sonidos. Una manera de hacer es la siguiente.
Por ahora no tiene los métodos de pausar, parar, etc.
Será necesario crear una clase que se llama ReproducirSonidos y la otra llamada PruebasSonidos que es la clase principal.

Nota: Dentro de la carpeta del proyecto, es necesario crear una carpeta llamada sonidos y almacenen ahí los sonidos que usen en su proyecto.



/*
 * Nombre de la clase: ReproducirSonidos
 * Descripción: Controla el sonido que se esté reproduciendo, utilizando un hilo
 *              sin opciones de pausea, stop o reanudar, simplemente lo ejecuta
                y comienza la reproducción de la canción, y espera hasta que finalice.
 */
package pruebassonidos;

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;

/**
 *
 * @author gsu Jesús Fernando Merino Merino
 */
public class ReproducirSonidos extends Thread{
    String mensaje;
    String sonido;
    int timeRep=0;
    boolean stop=false;
    public ReproducirSonidos(){
        mensaje="Hola";
    }
    public ReproducirSonidos(String sonido){
        this.sonido=sonido;
    }
    public ReproducirSonidos(String sonido,boolean stop){
        this.sonido=sonido;
        stop=false;
    }
    public void run(){
        repSonido(sonido);
        System.out.println("Este proceso ha terminado:"+this.getName());
    }

    public void setMensaje(String msj){
        this.mensaje = msj;
    }
    
    public void repSonido(String sonido){
        SourceDataLine soundLine = null;
        int BUFFER_SIZE = 64*1024;  // 64 KB
        // Set up an audio input stream piped from the sound file.
        try {
           File soundFile = new File(sonido);
           AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
           AudioFormat audioFormat = audioInputStream.getFormat();
           DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
           soundLine = (SourceDataLine) AudioSystem.getLine(info);
           soundLine.open(audioFormat);
           soundLine.start();
           int nBytesRead = 0;
           byte[] sampledData = new byte[BUFFER_SIZE];
           while (nBytesRead != -1) {
              nBytesRead = audioInputStream.read(sampledData, 0, sampledData.length);
              if (nBytesRead >= 0) {
                 // Writes audio data to the mixer via this source data line.
                 soundLine.write(sampledData, 0, nBytesRead);
              }
           }
        } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
            System.err.println("Error: "+ex.getMessage());
        } finally {
           soundLine.drain();
           soundLine.close();
        }
    }
}

Clase principal del proyecto...
/*
 * Clase: PruebaSonidos
 * Descripción: Programa que reproduce una cación en segundo plano, usando hilos.
 */
package pruebassonidos;


/**
 *
 * @author gXfer Jesus Fernando Merino Merino
 */
public class PruebasSonidos {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        ReproducirSonidos reproducir = new ReproducirSonidos("sonidos/ajws.au");
        reproducir.start();
        System.out.println("Después de la canción");
    }
}

Pueden descargar el proyecto aquí. Gracias por visitar, si tienen dudas comenten por favor.

0 comments:

Publicar un comentario