[英]How do I play an audio in a loop in Java?
每次完成后,我只想循环播放音频。 我不得不说这只是背景音乐,它在一个线程中运行。 这是代码:
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();
}
}
我找到了源代码: https://github.com/umjammer/jlayer/tree/master/src/main/java/javazoom/jl/player/advanced
您应该使用AdvancedPlayer
而不是Player
。 它允许您注册一个PlaybackListener
,它会在音乐停止时接收PlaybackEvent
。
这段代码应该可以解决问题:
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();
}
}
我有一个解决方案给你。 制作一个新的 java 文件并将其命名为任何名称。 然后执行以下代码:
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++){}
}
}
}
我看到您正在使用 Javazoom。
查看我在 github 上找到的该库的文档,有一个 class 应该更好地工作: AdvancedPlayer in combination with a PlaybackListener 。
如果这类似于 Java 中的大多数侦听器,则可以将其设置为感知音频何时结束,并在该事件上调用另一个播放。 不过,自从我使用这个库已经有很长时间了,我所做的只是将它用于将 ogg/vorbis 文件转换为 PCM,所以我无法帮助您提供所需的特定代码。
如果您可以使用 wav 文件,那么使用 Java 的Clip
class 和它的loop()
方法会容易得多。 mp3 文件到 wav 的转换可以使用Audacity之类的工具来完成,如果您的应用程序可以预先准备好资产。
如果您确切知道要播放什么代码,另一种可能性是确定某些 header 信息中可能存在的长度,或者再次在Audacity中打开它,并将持续时间信息存储在您的项目中。 然后,对于播放代码,在循环之前添加一个Thread.sleep()
持续时间。 这可能不是很可靠。
当我试图解决一些问题时,我找到了一种更简单的方法。 检查此链接以获取解决方案。 我的代码是这样结束的:
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.