如何判断哪些.wav文件将与Java兼容?

如何判断哪些.wav文件将与Java兼容?,java,swing,wav,javasound,audio-player,Java,Swing,Wav,Javasound,Audio Player,编辑--我发现如果我使用“CircusSong”wav文件点击按钮,它就会开始播放。因此,我试图访问的其他文件一定不兼容。如何确定.wav文件的哪些格式可以工作 注意:我尝试过的每个音频文件都会在我的机器(Ubuntu)上播放。他们只是没有被IntelliJ认出 我有一个声音文件,在程序运行时播放(直到我停止线程)。我能够成功地将它添加到我的“src”文件夹中的“Sounds”文件夹中 注意:我刚刚在学习如何使用声音文件。如果我转到IntelliJ中的文件,下面是它的样子: 嗯,我想在节目中再

编辑--我发现如果我使用“CircusSong”wav文件点击按钮,它就会开始播放。因此,我试图访问的其他文件一定不兼容。如何确定.wav文件的哪些格式可以工作

注意:我尝试过的每个音频文件都会在我的机器(Ubuntu)上播放。他们只是没有被IntelliJ认出

我有一个声音文件,在程序运行时播放(直到我停止线程)。我能够成功地将它添加到我的“src”文件夹中的“Sounds”文件夹中

注意:我刚刚在学习如何使用声音文件。如果我转到IntelliJ中的文件,下面是它的样子:

嗯,我想在节目中再加一个声音,到目前为止我已经试了两个,但都没有成功。当我将鼠标悬停在错误上方时,会得到“预期的类或接口”:

以下是用于这两个文件的内容:

字段声明和声音剪辑方法:

public class SimManager implements SimulationEventListener, LineListener {
    File mainMusicThemeSong = new File("src/Sounds/CircusSong.wav");
    File selectionSound = new File("src/Sounds/SelectionSound.wav");
    public static Clip mainClip;
    public static Clip selectionClip;

public void playSelectionSound() {
        try {
            Line.Info linfo = new Line.Info(Clip.class);
            Line line = AudioSystem.getLine(linfo);
            selectionClip = (Clip) line;
            selectionClip.addLineListener(this);
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(selectionSound);
            selectionClip.open(audioIn);
            selectionClip.start();
        } catch (Exception e) {
            System.out.println("ERROR WHILE PLAYING SOUND CLIP");
        }
    }
    public void playMainThemeSong() {
        try {
            Line.Info linfo = new Line.Info(Clip.class);
            Line line = AudioSystem.getLine(linfo);
            mainClip = (Clip) line;
            mainClip.addLineListener(this);
            AudioInputStream audioIn = AudioSystem.getAudioInputStream(mainMusicThemeSong);
            mainClip.open(audioIn);
            mainClip.start();
        }catch(Exception e) {
            System.out.println("ERROR PLAYING MUSIC CLIP");
        }

    }
然后,在这个类中,我决定播放哪个声音。单击“运行”后,将播放主主题。其他的声音应该在选择所有其他按钮时播放,但我只显示“正常设置事件”,所以没有太多不必要的代码

public void simulationEventOccurred(SimulationEvent simulationEvent)  {

if (simulationEvent.getEventType() == SimulationEvent.NORMAL_SETUP_EVENT) {
    playSelectionSound(); // <-- THIS DOESN"T WORK
    colonySim.initializeAntColony(); // INITIALIZE NORMALLY
    antSimGUI.setTime(time);
}
if (simulationEvent.getEventType() == SimulationEvent.RUN_EVENT) {

    isMoving = false;
    thisThread = new Thread() {
        public void run() {

            playMainThemeSong(); //<-- THIS WORKS
            mainClip.loop(-1); //<-- THIS LOOPS UNTIL THREAD STOPS
            newTurn(); // START INCREMENTING THROUGH TURNS
        }
    };
    thisThread.start();
}

IntelliJ希望并期望您将非源资源文件放在
src
文件夹之外,因为这是Java的一般做法。通常会创建一个与源文件夹相同级别的
res
或其他资源文件夹,因为源文件夹是用来编译代码的。@Vulcan我想我理解这一点,但为什么第一个声音工作正常?@Vulcan多年来习惯于将资源放在
src
中,直到Maven出现,一些高级开发人员做出了相反的决定,Intellij(像大多数IDE一样)倾向于“鼓励”开发人员使用特定的ethos/psudo标准,这并不总是有帮助的。话虽如此,我认为首选的“标准”是
资源
,但这就是首选的项目结构1)应用程序资源在部署时将成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。2) WAV是一种容器格式。容器中可能使用的某些编码可以由Java Sound处理,而其他编码则不能。为了防止您忽略它,使用URL确实是最安全的方法,而不是使用文件名,正如Andrew在上面指出的那样。你试过了吗?文件名不适用于JAR中的音频文件,但URL适用。如果IntelliJ正在做一些棘手的事情,那么其中的文件子系统可能是虚拟的,操作系统无法将其作为普通文件读取(即,从IntelliJ外部读取)。IntelliJ希望并期望您将非源资源文件放置在
src
文件夹之外,因为这是Java的一般做法。通常会创建一个与源文件夹相同级别的
res
或其他资源文件夹,因为源文件夹是用来编译代码的。@Vulcan我想我理解这一点,但为什么第一个声音工作正常?@Vulcan多年来习惯于将资源放在
src
中,直到Maven出现,一些高级开发人员做出了相反的决定,Intellij(像大多数IDE一样)倾向于“鼓励”开发人员使用特定的ethos/psudo标准,这并不总是有帮助的。话虽如此,我认为首选的“标准”是
资源
,但这就是首选的项目结构1)应用程序资源在部署时将成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。2) WAV是一种容器格式。容器中可能使用的某些编码可以由Java Sound处理,而其他编码则不能。为了防止您忽略它,使用URL确实是最安全的方法,而不是使用文件名,正如Andrew在上面指出的那样。你试过了吗?文件名不适用于JAR中的音频文件,但URL适用。如果IntelliJ正在做一些棘手的事情,那么其中的文件子系统可能是虚拟的,操作系统无法将其作为普通文件读取(即,从IntelliJ外部读取)。
    COULDN'T PLAY SOUND CLIP
javax.sound.sampled.UnsupportedAudioFileException: could not get audio input stream from input file
    at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1189)
    at SimManager.simulationEventOccurred(SimManager.java:131)
    at AntSimGUI.fireSimulationEvent(AntSimGUI.java:193)
    at AntSimGUI$ControlPanel$ButtonHandler.actionPerformed(AntSimGUI.java:407)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289)
    at java.awt.Component.processMouseEvent(Component.java:6535)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6300)
    at java.awt.Container.processEvent(Container.java:2236)
    at java.awt.Component.dispatchEventImpl(Component.java:4891)
    at java.awt.Container.dispatchEventImpl(Container.java:2294)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
    at java.awt.Container.dispatchEventImpl(Container.java:2280)
    at java.awt.Window.dispatchEventImpl(Window.java:2750)
    at java.awt.Component.dispatchEvent(Component.java:4713)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.awt.EventQueue$4.run(EventQueue.java:729)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)