Quiero reproducir solo un audio en un bucle cada vez que esto haya terminado. Tengo que decir que es solo música de fondo y se está ejecutando en un hilo. Aquí está el código:
package Generator; import javazoom.jl.player.Player; import java.io.FileInputStream; import java.io.FileNotFoundException; import javazoom.jl.decoder.JavaLayerException; public class Reproductor { Player reproductor; public void reproducir() throws FileNotFoundException, JavaLayerException { reproductor = new Player(new FileInputStream("C:\\Users\\Leonardo\\Desktop\\config generator\\Recursos\\Triage at dawn.mp3")); new Thread () { @Override public void run() { try { reproductor.play(); //This just play the audio for the first time. } catch (JavaLayerException ex) { } } }.start(); } public void parar() { if(reproductor != null) { reproductor.close(); } }tengo una solucion para ti. crea un nuevo archivo java y llámalo como quieras. Luego haz este código:
class Main{ public static void main(String[] args) { int length = 10000000000, numberOfTimes = 5; Reproducer reproducer = new Reproducer(); for(int j =0;j < numberOfTimes;i++){ reproducer.reproducir(); for(int i =0;i < length;i++){} } } }Encontré el código fuente: https://github.com/umjammer/jlayer/tree/master/src/main/java/javazoom/jl/player/advanced
Debe usar un AdvancedPlayer en lugar de un Player . Le permite registrar un PlaybackListener que recibirá un PlaybackEvent cuando la música se detenga.
Este código debería hacer el truco:
package Generator; import javazoom.jl.player.Player; import java.io.FileInputStream; import java.io.FileNotFoundException; import javazoom.jl.decoder.JavaLayerException; public class Reproductor { Player reproductor; public void reproducir() throws FileNotFoundException, JavaLayerException { reproductor = new Player(new FileInputStream("C:\\Users\\Leonardo\\Desktop\\config generator\\Recursos\\Triage at dawn.mp3")); PlaybackListener myListener = new PlaybackListener() { public void playbackStarted(PlaybackEvent evt){ // Do nothing } public void playbackFinished(PlaybackEvent evt){ // Restart reproductor.play(); } }; reproductor.setPlayBackListener( myListener ); new Thread () { @Override public void run() { try { reproductor.play(); //This just play the audio for the first time. } catch (JavaLayerException ex) { } } }.start(); } public void parar() { if(reproductor != null) { reproductor.close(); } }Veo que estás usando Javazoom.
Mirando la documentación de esta biblioteca que encontré en github, hay una clase que debería funcionar mejor: AdvancedPlayer en combinación con PlaybackListener .
Si esto es similar a la mayoría de los oyentes en Java, se puede configurar para detectar cuando el audio ha terminado y, en ese caso, llamar a otra reproducción. Sin embargo, ha pasado mucho tiempo desde que trabajé con esta biblioteca, y todo lo que hice fue usarla para convertir archivos ogg/vorbis a PCM, por lo que no puedo ayudarlo con el código específico necesario.
Si puede usar archivos wav, sería mucho más fácil usar la clase Clip de Java y su método loop() . Las conversiones de archivos mp3 a wav se pueden realizar con una herramienta como Audacity , si su aplicación permite preparar los recursos de antemano.
Si sabe exactamente qué código va a reproducir, otra posibilidad sería determinar la duración que puede estar presente en alguna información de encabezado, o abrirlo nuevamente en Audacity , y almacenar la información de duración en su proyecto. Luego, para el código de reproducción, agregue un Thread.sleep() para la duración antes del bucle. Esto probablemente no será muy confiable.
Mientras intentaba resolver algunos problemas, encontré una manera más fácil de hacerlo. Consulta este enlace para encontrar la solución . Mi código terminó así:
package Generator; import java.io.FileInputStream; import java.io.FileNotFoundException; import javazoom.jl.decoder.JavaLayerException; import javazoom.jl.player.Player; public class Reproductor extends Thread{ private String ruta; private boolean bucle; private Player reproductor; public Reproductor(String ruta, boolean bucle) { this.ruta = ruta; this.bucle = bucle; } public void run() { try { do{ FileInputStream buff = new FileInputStream(ruta); reproductor = new Player(buff); reproductor.play(); try { reproductor.play(); } catch (JavaLayerException ex) {} }while(bucle); } catch(FileNotFoundException | JavaLayerException ioe) {} } public void parar() { bucle = false; reproductor.close(); this.interrupt(); } }