java - java目录下循环播放声音

标签 java audio

我需要一些声音类的解释。因此,我创建了一个 Sound 对象类,以便我稍后可以简单地调用我需要的任何声音。我的文件位于与 java 文件同一目录中的 sounds 文件夹中。所以它是 ~\Game\sounds\music.wav 现在每次我通过创建一个对象然后调用它从主类执行此代码时,它都会告诉我文件不存在,我是否指向错误到文件中?目前我的 fileName 只是 "music.wav" 我怎样才能将它指向 sounds 目录而不对目录进行硬编码以便它可以工作在任何 CPU 上。

public Sound(String fileName) {
        try {
                File file = new File(fileName);
                if (file.exists()) {
                    myClip = (AudioClip) Applet.newAudioClip(file.toURI().toURL());
                } else {
                    throw new RuntimeException("Sound: file not found: " + fileName);
                }
        } catch (MalformedURLException e) {
            throw new RuntimeException("Sound: malformed URL: " + e);
        }
}
public void play() {
    myClip.play();
}

最佳答案

希望这段代码能对您有所帮助。我在 src 下创建了一个名为 resources。在资源包下,我放置了所有声音文件。

import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;

public enum SoundEffect  {


    BUSY("resources/phone-busy.wav"),   
    CALLING("resources/phone-calling.wav"),         
    DISCONNECT("resources/phone-disconnect.wav"),
    RING("resources/telephone-ring.wav");  

    // Each sound effect has its own clip, loaded with its own sound file.
    private Clip clip;
    private URL url;
    private AudioInputStream audioInputStream;

    // Constructor to construct each element of the enum with its own sound file.
    SoundEffect(String soundFileName) {
        try {
            // Use URL (instead of File) to read from disk and JAR.
            this.url = this.getClass().getClassLoader().getResource(soundFileName);
            // Set up an audio input stream piped from the sound file.
            this.audioInputStream = AudioSystem.getAudioInputStream(url);
            // Get a clip resource.
            clip = AudioSystem.getClip();
            // Open audio clip and load samples from the audio input stream.
            clip.open(audioInputStream);

        } catch (UnsupportedAudioFileException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
    }

    // Play or Re-play the sound effect from the beginning, by rewinding.
    public void play() {

        clip.loop(Clip.LOOP_CONTINUOUSLY); 

    }

    public void stop(){

        clip.stop();   // Stop the player if it is still running
        clip.flush();
        clip.setFramePosition(0);
    }

    // Optional static method to pre-load all the sound files.
    static void init() {
        values(); // calls the constructor for all the elements
    }

    public boolean isActive(){

        return clip.isActive();
    }

    public boolean isOpen() {

        return clip.isOpen();
    }

    public void setFramePosition() {
        clip.setFramePosition(0);

    }

}

此类用于在 Swing 应用程序中测试 SoundEffect 枚举

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

// Testing the SoundEffect enum in a Swing application
@SuppressWarnings("serial")
public class SoundEffectDemo extends JFrame {


    // Constructor
    public SoundEffectDemo() {
        // Pre-load all the sound files


        // Set up UI components
        Container cp = this.getContentPane();
        cp.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));

        JButton btnSound1 = new JButton("CALLING");
        btnSound1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SoundEffect.CALLING.play(); 
            }
        });
        cp.add(btnSound1);

        JButton btnSound2 = new JButton("RING");
        btnSound2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                SoundEffect.RING.play();
            }
        });
        cp.add(btnSound2);

        JButton btnSound3 = new JButton("BUSY");
        btnSound3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                SoundEffect.BUSY.play();
            }
        });
        cp.add(btnSound3);

        JButton btnSound4 = new JButton("Stop Sound ");
        btnSound4.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                for(SoundEffect value : SoundEffect.values()){
                    if(value.isActive()){
                        value.stop();
                    }
                }

            }
        });
        cp.add(btnSound4);


        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("Test SoundEffct");
        this.pack();
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new SoundEffectDemo();
    }
}

关于java - java目录下循环播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255943/

相关文章:

java - 如何在 macOS 上显示空间变化

java - 通用分词器

java - 不需要关闭窗口,如果我按确认框中的取消按钮?

c# - 获取WAV文件的PCM值

android - 如何绘制声波?

JavaScript/JQuery 音频播放器 "Next"

java - 如何编辑java.util.package

java - 坚持为每个 sendMessage 授予权限

audio - 将音频背景视频与ffmpeg的原始视频合并

qt - 从 QMediaPlayer 获取 QAudioBuffer