繁体   English   中英

如何在 Java 中循环播放音频?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM