java - 为游戏添加声音。需要帮助

标签 java audio

所以我有这段代码,我想知道如何将它与游戏的其余部分结合起来,因为它现在播放声音的唯一方法是选择此类作为启动器。另外,我能否获取一些信息,具体更改了什么以及原因。我觉得我应该更好地理解这段代码,因为我刚刚找到了代码并粘贴了它:D 代码:

package main;

import main.Handler;
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.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;


public class AudioPlayer implements LineListener {

    boolean playCompleted;

    void play(String audioFilePath) {
        File audioFile = new File(audioFilePath);

        try {
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);

            AudioFormat format = audioStream.getFormat();

            DataLine.Info info = new DataLine.Info(Clip.class, format);

            Clip audioClip = (Clip) AudioSystem.getLine(info);

            audioClip.addLineListener(this);

            audioClip.open(audioStream);

            audioClip.start();

            while (!playCompleted) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }

            audioClip.close();

        } catch (UnsupportedAudioFileException ex) {
            System.out.println("The specified audio file is not supported.");
            ex.printStackTrace();
        } catch (LineUnavailableException ex) {
            System.out.println("Audio line for playing back is unavailable.");
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Error playing the audio file.");
            ex.printStackTrace();
        }

    }


    public void update(LineEvent event) {
        LineEvent.Type type = event.getType();

        if (type == LineEvent.Type.START) {
            System.out.println("Playback started.");

        } else if (type == LineEvent.Type.STOP) {
            playCompleted = true;
            System.out.println("Playback completed.");
        }

    }

    public static void main(String[] args) {
        String audioFilePath = "res/music/dark_theme.wav";
        AudioPlayer player = new AudioPlayer();
        player.play(audioFilePath);
    }


    }'

最佳答案

这个类是一个相当普通的类,使用起来:构造一个实例,调用一些方法,并且它执行预期的操作。当您将其用作启动器时,您所做的就是调用 main 方法,该方法作为如何使用此类的示例:

public static void main(String[] args) {
    String audioFilePath = "res/music/dark_theme.wav";
    AudioPlayer player = new AudioPlayer();
    player.play(audioFilePath);
}

只需构造一个实例,然后使用所需音频文件的名称对其调用 play() 即可。

但是,请注意,由于以下几个原因,此类并不是真正执行此操作的好示例:

  • 它在播放时会阻塞,这意味着您无法开始播放声音并同时执行不同的操作。
  • 它无法多次播放声音而不引发问题。

因此,让我们修改此类以避免出现这些问题。这个类将允许您将剪辑加载到内存中,并异步启动它(意味着您启动它,然后您的程序继续运行)。 start() 方法开始播放一次,loop() 方法则永远循环播放。 stop() 是不言自明的,一旦不再需要此音频剪辑,就应该调用 cleanup() 来释放资源。 (当然,如果您打算很快再次开始播放该剪辑,则此时不应该 cleanup())。

import main.Handler;
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.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineListener;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioPlayer{
    Clip audioClip;
    boolean playCompleted;
    String path;
    public AudioPlayer(String path){
        this.path = path;
        File audioFile = new File(path);

        try {
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);

            AudioFormat format = audioStream.getFormat();

            DataLine.Info info = new DataLine.Info(Clip.class, format);

            audioClip = (Clip) AudioSystem.getLine(info);

            audioClip.open(audioStream);

        } catch (UnsupportedAudioFileException ex) {
            System.out.println("The specified audio file is not supported.");
            ex.printStackTrace();
        } catch (LineUnavailableException ex) {
            System.out.println("Audio line for playing back is unavailable.");
            ex.printStackTrace();
        } catch (IOException ex) {
            System.out.println("Error playing the audio file.");
            ex.printStackTrace();
        }
    }
    void play() {
        audioClip.start();

    }
    void loop(){
        audioClip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    void stop(){
        audioClip.stop();
    }
    void cleanup(){
        audioClip.close();
    }

    public static void main(String[] args) throws InterruptedException {
        String audioFilePath = "res/music/dark_theme.wav";
        AudioPlayer player = new AudioPlayer(audioFilePath);
        player.play();
        // give the sound time to play
        while(true){
            Thread.sleep(1000);
        }
    }


}

关于java - 为游戏添加声音。需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109539/

相关文章:

没有自签名证书的 javax.net.ssl.SSLPeerUnverifiedException : Hostname XXX not verified,

java - 为什么 RMI localhost 客户端使用 no localhost ip 连接 RMI localhost 服务器

c# - WMP 声音在其他计算机上不起作用

audio - 如何用32位 float 据写入WAV文件?

audio - .yuv测试视频序列的音频源是否可用?

java - 如何在 Java 中从另一个构造函数调用一个构造函数?

java - Groovy的 "execute"方法和正常运行bash命令有什么区别?

java - 如何让异步监听器阻塞?

javascript - 如何在 react-native 中播放音频文件?主要在安卓

c# - C# 中的捕获设备列表(例如麦克风、立体声混音...)