java - 简短的声音文件在Netbeans中播放,但不在jar中播放

标签 java audio

我正在开发一个彩票程序,该程序使用不同的间隔来循环更新名称列表。对于每个更新,我都想播放一小段(300毫秒)click.wav。当我在Netbeans中运行该程序时,一切正常,但是当我构建jar时,它拒绝播放。奇怪的是,如果我通过在末尾添加静音来将声音延长到几秒钟,它会播放,但是时机已经全部消失,并且只有在循环运行4-5次后才开始播放。

我正在使用thread.sleep()在循环之间启动暂停。尽管这可能不是最好的方法,但它当然是最简单的方法,对于此程序的范围也无关紧要。我尝试使用计时器,但是声音仍然无法播放。

这是我播放wav文件的代码。

private static void play(String filename) {
    URL url = VinLotteri.class.getResource(filename);
    try {
        Clip clip = AudioSystem.getClip();
        clip.open(AudioSystem.getAudioInputStream(url));
        clip.start();
    } catch (LineUnavailableException | UnsupportedAudioFileException | IOException fail) {
    }
}

这是循环代码。请忽略(或给予 build 性批评)与该问题无关的任何错误代码。我只编程了几个月,所以可能有很多。
class StartTrekning extends SwingWorker<String, String> {

    private StartTrekning(List<String> navn, String vinner) {
    }

    @Override
    protected String doInBackground() {
        firstDraw = false;
        Random rnd = new Random();
        int v = 0;
        int vinnerID = -1;
        isRunning = true;
        int counterPluss = 0;
        int counterMinus = 0;

        int rand = rnd.nextInt(17) + 45; // Antall trekninger 45-61 
        //Setter opp ulik pause mellom hver trekning
        for (int i = rand; i > 0; i--) {
            if (i > 40) {
                v = 100;
            } else if (i > 35) {
                v = 150;
            } else if (i > 25) {
                v = 200;
            } else if (i > 20) {
                v = 250;
            } else if (i > 15) {
                v = 300;
            } else if (i > 10) {
                v = 400;
            } else if (i > 6) {
                v = 550;
            } else if (i > 3) {
                v = 800;
            } else if (i > 1) {
                v = 1200;
            } else if (i > 0 && rand > 53) {
                v = 2000;
            }

            play(click);
            vinnerID++;//Øker vinnerID, som gir index for navnelisten navn

            //"Loop-kode" (starter listen på nytt når den når slutten)
            if (vinnerID > navn.size() - 1) {
                vinnerID = 0;
            }
            vinner = navn.get(vinnerID);
            int pluss10 = vinnerID;
            int pluss9 = vinnerID;
            int pluss8 = vinnerID;
            int pluss7 = vinnerID;
            int pluss6 = vinnerID;
            int pluss5 = vinnerID;
            int pluss4 = vinnerID;
            int pluss3 = vinnerID;
            int pluss2 = vinnerID;
            int pluss1 = vinnerID;
            int minus1 = vinnerID;
            int minus2 = vinnerID;
            int minus3 = vinnerID;

            if (vinnerID > navn.size() - 11) {
                pluss10 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 10) {
                pluss9 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 9) {
                pluss8 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 8) {
                pluss7 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 7) {
                pluss6 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 6) {
                pluss5 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 5) {
                pluss4 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 4) {
                pluss3 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 3) {
                pluss2 = -10 + counterPluss;
            }
            if (vinnerID > navn.size() - 2) {
                pluss1 = -10 + counterPluss;
                counterPluss = 0;
            }
            if (vinnerID < 3) {
                minus3 = navn.size() + counterMinus;
            }
            if (vinnerID < 2) {
                minus2 = navn.size() + counterMinus;
            }
            if (vinnerID < 1) {
                minus1 = navn.size() + counterMinus;
            }
            if (vinnerID < 3) {
                counterMinus++;
            }
            if (vinnerID == 3) {
                counterMinus = 0;
            }
            if (vinnerID > navn.size() - 11) {
                counterPluss++;
            }
            //Slutt på "loop-kode"

            // Lager "rulleteksten"
            lblVinner.setText(vinner);
            lblHighlight1.setText(navn.get(minus1 - 1));
            lblHighlight2.setText(navn.get(minus2 - 2));
            lblHighlight3.setText(navn.get(minus3 - 3));
            lblHighlight7.setText(navn.get(pluss1 + 1));
            lblHighlight8.setText(navn.get(pluss2 + 2));
            lblHighlight9.setText(navn.get(pluss3 + 3));
            lblHighlight10.setText(navn.get(pluss4 + 4));
            lblHighlight11.setText(navn.get(pluss5 + 5));
            lblHighlight12.setText(navn.get(pluss6 + 6));
            lblHighlight13.setText(navn.get(pluss7 + 7));
            lblHighlight4.setText(navn.get(pluss8 + 8));
            lblHighlight5.setText(navn.get(pluss9 + 9));
            lblHighlight6.setText(navn.get(pluss10 + 10));
            try {
                Thread.sleep(v);
            } catch (InterruptedException ex) {
                Logger.getLogger(VinLotteri.class.getName()).log(Level.SEVERE, null, ex);
            }      
        }

        int rand1 = rnd.nextInt(100);
        //Legger inn en liten kunstpause
        if (rand1 < 50) {
            try {
                Thread.sleep(v);
            } catch (InterruptedException ex) {
                Logger.getLogger(VinLotteri.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        panelVinner.append(idVinn + ". Trekning: " + vinner + "\n"); //Skriver ut vinneren
        play(fanfare);
        flashText(lblVinner, Color.WHITE, Color.BLUE, 270, 1650);
        vinnere.add(vinner); //Lager vinnerliste
        idVinn++;
        nyListe(vinnerID, vinner);
        isRunning = false;
        return null;
    }

任何帮助将不胜感激。谢谢。

最佳答案

好了,经过(很多)更多的故障排除后,结果证明代码没有问题,尽管我仍然不知道到底是什么问题。但是我发现,如果我从命令窗口运行jar文件,则一切正常。如果我双击Windows中的相同文件,则存在声音问题。因此,必须与在Windows中启动文件时文件如何运行有关。

至少我现在可以通过从批处理文件或Windows快捷方式运行“java -jar myfile.jar”来使其在Windows中运行。

编辑:事实证明,在另一台计算机上运行时,它工作正常。所以我的设置有些问题。我将尝试卸载并重新安装JDK。

关于java - 简短的声音文件在Netbeans中播放,但不在jar中播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15475276/

相关文章:

java - 来自java的SQL日期时间

Java - 关闭所有对象后的 JDBC 内存使用

java - 如何计算总项目的总和

android - MediaPlayer播放音效

linux - 使用 ALSA 在只播放声卡上捕获播放

ios - AVAudioPlayer无法播放声音

java - 如何将用户在一种方法中获得的值用于同一类中的其他方法

java - 我的 ArrayList 会发生什么

java - 如何在 Java 中淡入淡出 .wav 文件?

amazon-web-services - 通过 MediaLive 服务器进行音频流式传输