[SOLUCIONADO]Abrir Audio.wav contenido en un Jar ¿?

Iniciado por 1mpuls0, 28 Julio 2009, 00:23 AM

0 Miembros y 1 Visitante están viendo este tema.

1mpuls0

Hola camaradas del foro, durante mi corta vida de programador he aprendido algunas técnicas y trucos para la programación en Java, y estas técnicas a su vez han ido mejorando, como por ejemplo, antes escribia

etq1 = new JLabel( "", new ImageIcon( "images/Stop.png" ), SwingConstants.LEFT );

como muchos sabran al guardar esto en un jar, y cambiar de jar de direccion no muestra la imagen (aun sabiendo que esta guardada en nuestro jar)

pero si hacemos lo siguiente

botDetener.setIcon(new ImageIcon(getClass().getResource("/images/Stop.png")));

crear nuestro jar y cambiar de direccion el jar, si nos muestra la imagen. (parece ser que la clave esta en getClass().getResource)

Bien pues ahora tengo un problema con el audio.
He guardado un Audio.wav en un jar, al momento de cambiar el jar de direccion no lo reproduce (solo estando e la misma direccion, y asi no tiene chiste)

por ejemplo tengo esto:


private void botReproducirActionPerformed(ActionEvent evt) {

      String path = "Audio.wav";
//javax.sound.sampled.Clip aReproducir;
try
{
           sonido=AudioSystem.getClip();
   sonido.open(AudioSystem.getAudioInputStream(new File(path)));
   sonido.start();
}
catch (Exception fallo)
{
System.out.println(fallo);
}
}


y quiero saber si alguien sabe que codigo debe de ir para que nuestro jar lo pueda reconocer (por eso puse el ejemplo de la imagen), y que por favor me pueda explicar como debo hacerlo.

espero me haya explicado.

Muchas gracias

Saludos
abc

juancho77

getClass().getResource() se usa para obtener la ruta relativa en relación al programa. Debes usar esta forma y no la forma absoluta ya que si alguna vez decides cambiar de carpeta el programa, tendrías que revisar el código para que siga funcionando.
Lo bueno es que se puede usar con cualquier tipo de archivos, no solo imagenes. No sé programar con sonidos en Java, pero supongo que si modificas el valor de la variable Path(absoluta) por una relativa usando getClass().getResource(), debería funcionar.

1mpuls0

#2
Cita de: juancho77 en 28 Julio 2009, 08:09 AM
getClass().getResource() se usa para obtener la ruta relativa en relación al programa. Debes usar esta forma y no la forma absoluta ya que si alguna vez decides cambiar de carpeta el programa, tendrías que revisar el código para que siga funcionando.
Lo bueno es que se puede usar con cualquier tipo de archivos, no solo imagenes. No sé programar con sonidos en Java, pero supongo que si modificas el valor de la variable Path(absoluta) por una relativa usando getClass().getResource(), debería funcionar.

no amigo ya intente de varias formas aqui algunas de ellas y lo que me muestra


1. URL url = getClass().getResource("welcome.wav");
      String path = ""+ url;
      System.out.println("Ruta"+path);
(al intentar reproducir me muestra eso)
Ruta file:/C:/Reproductor/welcome.wav

java.io.FileNotFoundException: file:\C:\Reproductor\welcome.wav (El nombre de archivo, directorio o etiqueta del volumen no es válido)



2. String path = getClass().getResource("welcome.wav").toString();
(al intentar reproducir me muestra esto)
Ruta file:/C:/Reproductor/welcome.wav

java.io.FileNotFoundException: file:\C:\Reproductor\welcome.wav (El nombre de archivo, directorio o etiqueta del volumen no es válido)

3. sonido=AudioSystem.getClip();
    sonido.open(AudioSystem.getAudioInputStream(new File(getClass().getResource("welcome.wav").toURI())));

(en este caso si lo reproduce pero solo estando a nivel del jar :S)


Me estoy volviendo loco, he mirado que algunos juegos tienen sonidos dentro del jar y se reproducen. Pero igual seguire buscando o espero alguien pueda ayudarme
abc

1mpuls0

#3
Bueno contesto a mi duda  ;D (despues de mucho intentar)

Esto es para reproducir un sonido dentro de un JAR, en una clase extendida a JFrame (Me parece que para los applets es diferente).

Se utiliza la clase InputStream.

private void reproducir(String nombre)
{
    InputStream path = getClass().getResourceAsStream("/sounds/" +nombre);

try
{
sonido=AudioSystem.getClip();
sonido.open(AudioSystem.getAudioInputStream(path));
sonido.start();

}catch(Exception fallo){
System.out.println(fallo);
}
}


Aunque tengo unos problemas con sonidos grandes (en cuanto a duración), y cuando clickeo reproducir se traslapan los sonidos (en caso de que esté en reproduccion alguno), pero intentaré arreglar eso.

Por lo menos espero y le sirva a alguien.

Saludos


abc